okhttp3utils-utils怎么获得 getheaderfields

博客访问: 3382
博文数量: 48
博客积分: 0
博客等级: 民兵
技术积分: 490
注册时间:
认证徽章:
做人好比游泳,游泳累了也是不能停的。
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: Android平台
HTTP是现代应用的网络。这就是我们如何交换数据和媒体。让你的东西做HTTP有效负载的速度和节省带宽。
okhttp是HTTP客户端的有效默认:
HTTP 2支持允许所有请求相同的主机共享一个插座。
连接池减少请求的延迟(如HTTP / 2不可用)。
透明的gzip收缩下载大小。
响应缓存避免完全重复要求网络。
okhttp坚守当网络是麻烦:它会悄悄地从常见的连接问题恢复。如果你的服务有多个IP地址okhttp将备用地址,如果第一次连接失败。这是IPv4向IPv6必要冗余的数据中心托管服务。okhttp发起新的连接特点现代TLS(SNI,alpn),落回TLS 1如果握手失败。
使用okhttp是容易的。它的请求/响应的API的设计与流畅的建设者和不变性。它同时支持同步和异步调用阻塞调用回调函数。
okhttp支持&2.3及以上。对于,最低要求是1.7。
最近半年来身边开发的朋友越来越多的提到OkHttp,上谷歌百度一下,确实OkHttp成了时下最火的HTTP框架。现在把自己整理的官方教程分享给大家,希望给初学者带来帮助。
主要包含了一些常见的操作:HTTP GET, HTTP POST,POST单个和多个文件上传),图片加载等。如图:
AndroidManifest.xml配置
Android Studio
compile 'com.zhy:okhttputils:2.6.2'
下载最新jar:& &&&& &&& 注:点击可下载,
工具类代码太多未完全给出,直接下载即可调试或使用。
阅读(126) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。如何高效的使用Okhttp - 推酷
如何高效的使用Okhttp
是一个在开发可汗学院Android APP过程中非常重要的依赖库。它的默认的配置为我们提供了非常重要实用功能,下面一些步骤我们可以让Okhttp提供更多功能使用灵活和内省能力。
1. 启用文件系统上的响应缓存
默认情况下,Okhttp不支持响应缓存,包括HTTP Cache-Control头允许缓存响应。因此,客户端通过一次又一次的请求相同的资源浪费时间和带宽。而不是简单地读取初始响应后缓存的副本。
要在文件系统中启用响应缓存,需要配置com.squareup.okhttp.Cache实例,并把它传递给你的OkHttpClient实例的setCache方法。你必须初始化缓存与存放目录的文件,并以字节为单位的最大值。
响应返回数据可以写入给定目录文件,如果一个响应的缓存超过了给定的大小。我们可以采取
我们可以在
的回复。我们可以通过context.getCacheDir()在子目录中缓存我们的响应:
// Base directory recommended by /a/717.
// Guard against null, which is possible according to
// /d/msg/android-developers/-694j87eXVU/YYs4b6kextwJ and
// /q/717.
final @Nullable File baseDir = context.getCacheDir();
if (baseDir != null) {
final File cacheDir = new File(baseDir, &HttpResponseCache&);
okHttpClient.setCache(new Cache(cacheDir, HTTP_RESPONSE_DISK_CACHE_MAX_SIZE));
// Base directory recommended by /a/717.
// Guard against null, which is possible according to
// /d/msg/android-developers/-694j87eXVU/YYs4b6kextwJ and
// /q/717.
final @NullableFilebaseDir = context.getCacheDir();
if (baseDir != null) {
&&final FilecacheDir = new File(baseDir, &HttpResponseCache&);
&&okHttpClient.setCache(new Cache(cacheDir, HTTP_RESPONSE_DISK_CACHE_MAX_SIZE));
在可汗学院的程序中我们指定 HTTP_RESPONSE_DISK_CACHE_MAX_SIZE as 10 * 1024 * 1024 , or 10 MB的大小
2. 集成Stetho
是Facebook的一个可爱的库,可以使用Chrome浏览器的Chrome开发人员工具功能来检查你的Andr oid应用程序。
Stetho除了允许你检查你的应用程序的SQLite数据库,还可以查看View的层次结构。允许你检查由OkHttp发起的每个请求和响应:
这种自省机制是确保服务器返回允许资源缓存的HTTP头是非常有用的,以及验证没有请求时,保证缓存的资源存在。
要想使用Stetho,只需添加一个StethoInterceptor实例的网络拦截器列表:
okHttpClient.networkInterceptors().add(new StethoInterceptor());
okHttpClient.networkInterceptors().add(new StethoInterceptor());
然后,运行应用程序,打开浏览器后,输入chrome://inspect。然后你就会看到应用程序的设备和标识符的列表。然后鼠标右键选择inspect 打开开发者工具,然后打开新的tab,开始监控OkHttp请求。
3. 使用Picasso 和 Retrofit
你可能使用过
来加载网络图片,或者使用
来简化发出请求和解码响应。这些第三方库将隐式地创建自己的OkHttpClient供内部使用,如果你不明确指定一个。
Picasso&version 2.5.2的OkHttpDownloader类:
private static OkHttpClient defaultOkHttpClient() {
OkHttpClient client = new OkHttpClient();
client.setConnectTimeout(Utils.DEFAULT_CONNECT_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
client.setReadTimeout(Utils.DEFAULT_READ_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
client.setWriteTimeout(Utils.DEFAULT_WRITE_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
private static OkHttpClientdefaultOkHttpClient() {
&&OkHttpClientclient = new OkHttpClient();
&&client.setConnectTimeout(Utils.DEFAULT_CONNECT_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
&&client.setReadTimeout(Utils.DEFAULT_READ_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
&&client.setWriteTimeout(Utils.DEFAULT_WRITE_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
Retrofit也有类似的工厂方法来创建自己的OkHttpClient。
图片一般在应用程序中需要加载的比较大的资源。尽管Picasso自己维护它的LRU机制来缓存图片,在内存中严格执行。如果客户端尝试使用Picasso来加载图片。Picasso会找不到其在内存中缓存图像,然后将委托加载该图片到它的内部OkHttpClient实例。并且默认情况下该实例将始终从服务器加载图片资源。
作为defaultOkHttpClient的方法不能与上面提到的文件系统中的响应缓存配置结合起来。
指定你自己的OkHttpClient实例允许返回数据从文件系统缓存响应,图片不会从服务器加载。这是非常重要的在程序第一次启动以后。这个时候Picasso的内存缓存是冷的。所以它会频繁的委托OkHttpClient实例去加载图片。
这就需要构建配置了您Picasso 的OkHttpClient实例,如果你在你的代码中使用
Picasso.with(context).load(...)
Picasso.with(context).load(...)
加载图片,你是用的是Picasso的单例模式。这是通过with方法懒汉模式地实例化并配置自己的OkHttpClient。因此,我们必须使我们自己的Picasso实例在单例之前通过wiht方法调用。
实现这个,可以简单的将OkHttpClient实例封装在OkHttpDownloader中,然后传递给 Picasso.Builder 实例的downloader方法。
final Picasso picasso = new Picasso.Builder(context)
.downloader(new OkHttpDownloader(okHttpClient))
// The client should inject this instance whenever it is needed, but replace the singleton
// instance just in case.
Picasso.setSingletonInstance(picasso);
final Picassopicasso = new Picasso.Builder(context)
&&&&.downloader(new OkHttpDownloader(okHttpClient))
&&&&.build();
// The client should inject this instance whenever it is needed, but replace the singleton
// instance just in case.
Picasso.setSingletonInstance(picasso);
在Retrofit中要使用OkHttpClient实例,需要改造1.9.x的一个RestAdapter,需要将OkHttpClient封装OkClient的实例中。然后把它传递给RestAdapter.Builder实例的setClient方法。
restAdapterBuilder.setClient(new OkClient(httpClient));
restAdapterBuilder.setClient(new OkClient(httpClient));
在 Retrofit 2.0中只需要简单的将OkHttpClient传递给Retrofit.Builder实例的client方法。
在可汗学院的APP中我们通过
依赖注入来确保我们只有一个OkHttpClient的实例。这种方法同样也适用于Picasso和Retrofit我们提供了一个为OkHttpClient实例提供单例模式的注解示例:
@Singleton
public OkHttpClient okHttpClient(final Context context, ...) {
final OkHttpClient okHttpClient = new OkHttpClient();
configureClient(okHttpClient, ...);
return okHttpC
@Singleton
public OkHttpClientokHttpClient(final Contextcontext, ...) {
&&final OkHttpClientokHttpClient = new OkHttpClient();
&&configureClient(okHttpClient, ...);
&&return okHttpC
OkHttpClient将会通过Dagger的注解创建一个实例提供给我们的Picasso和Retrofit。
4.指定一个用户代理拦截器
日志文件和分析为我们提供了更多有用的信息,当客户在每个请求提供详细的User-Agent header值的时候。默认情况下,Okhttp包含User-Agent值只有在特定的Okhttp版本中。为了指定我们自己的user agent。首先创建拦截器的替换值,
public final class UserAgentInterceptor implements Interceptor {
private static final String USER_AGENT_HEADER_NAME = &User-Agent&;
private final String userAgentHeaderV
public UserAgentInterceptor(String userAgentHeaderValue) {
this.userAgentHeaderValue = Preconditions.checkNotNull(userAgentHeaderValue);
public Response intercept(Chain chain) throws IOException {
final Request originalRequest = chain.request();
final Request requestWithUserAgent = originalRequest.newBuilder()
.removeHeader(USER_AGENT_HEADER_NAME)
.addHeader(USER_AGENT_HEADER_NAME, userAgentHeaderValue)
return chain.proceed(requestWithUserAgent);
public final class UserAgentInterceptor implements Interceptor {
&&private static final String USER_AGENT_HEADER_NAME = &User-Agent&;
&&private final String userAgentHeaderV
&&public UserAgentInterceptor(String userAgentHeaderValue) {
&&&&this.userAgentHeaderValue = Preconditions.checkNotNull(userAgentHeaderValue);
&&@Override
&&public Responseintercept(Chainchain) throws IOException {
&&&&final RequestoriginalRequest = chain.request();
&&&&final RequestrequestWithUserAgent = originalRequest.newBuilder()
&&&&&&&&.removeHeader(USER_AGENT_HEADER_NAME)
&&&&&&&&.addHeader(USER_AGENT_HEADER_NAME, userAgentHeaderValue)
&&&&&&&&.build();
&&&&return chain.proceed(requestWithUserAgent);
为了创建User-Agent header值人然后传递给UserAgentInterceptor的构造器,使用你得到的任何信息。
我们可以使用:
android 的系统信息可以清晰的传递出这是一台android 设备
Build.MODEL 或者“制造商提供的用户可见最终可见的名称”
Build.BRAND或者“消费者可见的品牌与产品/硬件相关信息”
Build.VERSION.SDK_INT或者“消费者可见的Android提供的SDK版本号”
BuildConfig.APPLICATION_ID
BuildConfig.VERSION_NAME
BuildConfig.VERSION_CODE
最后三个值由的applicationID,VERSIONCODE和VERSIONNAME的值在我们的Gradle build脚本中
了解更多信息可以查看
请注意,如果您的应用程序使用的是WebView,您可以配置使用相同的 User-Agent header值,你可以通过下面方法创建UserAgentInterceptor:
WebSettings settings = webView.getSettings();
settings.setUserAgentString(userAgentHeaderValue);
WebSettingssettings = webView.getSettings();
settings.setUserAgentString(userAgentHeaderValue);
5.指定合理的超时
2.5.0版本之前,OkHttp请求默认为永不超时。2.5.0版本开始如果建立连接请求超时,如果从连接读取下一个字节或写入的下一个字节到连接,花费超过10秒,就终止。这样做需要更新到2.5.0版本我们就不需要在我们的代码中修改bug。原因很简单是我因为我们第一次使用的时候使用了错误的路径。
要覆盖这些默认值,可以分别调用setConnectTimeout,setReadTimeout或setWriteTimeout。
需要注意的是Picasso和Retrofit为OkHttpClient实例指定不同的超时值时,默认情况下,Picasso指定:
连接超过15秒.
读取超过20秒
写入超过20秒
而Retrofit指定:
连接超过15秒.
读取超过20秒
没有写入超时
通过配置Picasso和Retrofit自己的OkHttpClient实例你可以确保所有的请求超时是一致的
Okhttp默认的配置为我们提供了非常重要实用功能。通过采用上述步骤,你可以增加它的灵活性和内省的能力并提高应用程序的质量。
如何高效的使用Okhttp
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致OkHttp-utils的使用
时间: 20:34:35
&&&& 阅读:48
&&&& 评论:
&&&& 收藏:0
标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&1.添加依赖:compile ‘com.zhy:okhttputils:2.6.2‘
2.清单文件中注册初始化:
& 初始化:OkHttpClient okHttpClient = new OkHttpClient.Builder()
//&&&&&&&&&&&&&&& .addInterceptor(new LoggerInterceptor("TAG"))
&&&&&&&&&&&&&&& .connectTimeout(10000L, TimeUnit.MILLISECONDS)
&&&&&&&&&&&&&&& .readTimeout(10000L, TimeUnit.MILLISECONDS)
&&&&&&&&&&&&&&& //其他配置
&&&&&&&&&&&&&&& .build();
&&&&&&& OkHttpUtils.initClient(okHttpClient);
3.okhhtp-utils的get请求:
& OkHttpUtils.get()
&&&&&&&&&&&&&&& .url("/boxoffice/day/query?key=1db&area=CN")
&&&&&&&&&&&&&&& .build()
&&&&&&&&&&&&&&& .execute(new StringCallback() {
&&&&&&&&&&&&&&&&&&& @Override
&&&&&&&&&&&&&&&&&&& public void onError(Call call, Exception e, int id) {
&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&& @Override
&&&&&&&&&&&&&&&&&&& public void onResponse(String response, int id) {
&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&& });
4.okhhtp-utils的post请求:
&& OkHttpUtils.post()
&&&&&&&&&&&&&&& .url("/appstore/horoscope/day")
&&&&&&&&&&&&&&& .addParams("date", year1)
&&&&&&&&&&&&&&& .addParams("hour", day1)
&&&&&&&&&&&&&&& .addParams("key", "1d")
&&&&&&&&&&&&&&& .build()
&&&&&&&&&&&&&&& .execute(new StringCallback() {
&&&&&&&&&&&&&&&&&&& @Override
&&&&&&&&&&&&&&&&&&& public void onError(Call call, Exception e, int id) {
&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&& @Override
&&&&&&&&&&&&&&&&&&& public void onResponse(String response, int id) {
&&&&&&&&&&&&&&&&&&&&&&& Log.d("sss", "response:::" + response);
&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&& });
5.okhhtp-utils加载图片:
& OkHttpUtils.get()
&&&&&&&&&&&&&&& .url("http://192.168.13.89:8080/Web_server/a.jpg")
&&&&&&&&&&&&&&& .build()
&&&&&&&&&&&&&&& .execute(new BitmapCallback() {
&&&&&&&&&&&&&&&&&&& @Override
&&&&&&&&&&&&&&&&&&& public void onError(Call call, Exception e, int id) {
&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&& @Override
&&&&&&&&&&&&&&&&&&& public void onResponse(Bitmap response, int id) {
&&&&&&&&&&&&&&&&&&&&&&& image.setImageBitmap(response);
&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&& });标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&原文:/livelihood/p/6758737.html
教程昨日排行
&&国之画&&&& &&&&&&
&& &&&&&&&&&&&&&&
鲁ICP备号-4
打开技术之扣,分享程序人生!}

我要回帖

更多关于 stringutils 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信