Articles of okhttp3

如何为OkHttpClient设置超时?

我正在使用android 4.4.2在物理设备上进行本机android项目(Java)测试。 我的OkHttpClient websocket连接但在10秒后超时,这是我试图用来更改超时设置。 OkHttpClient client = new OkHttpClient(); client.setReadTimeout(0, TimeUnit.MILLISECONDS); 但它是说Cannot resolve method setReadTimeout(int, java.util.concurrent.TimeUnit) 这些是我的import: import android.util.Log; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; import okhttp3.ResponseBody; import okhttp3.ws.WebSocket; import okhttp3.ws.WebSocketCall; import okhttp3.ws.WebSocketListener; import okio.Buffer; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.io.IOException; import java.util.*; import java.util.concurrent.TimeUnit; 在我的gradle文件中,我compile ‘com.squareup.okhttp3:okhttp-ws:3.4.1’

改造关闭响应机构

我一直在收到这个错误: A connection to ****** was leaked. Did you forget to close a response body? 所以我继续关闭我得到的回复。 response.body().close() 问题是如果response.body()已经转换为自定义类,则没有可用的close方法。 我也尝试调用raw并给我一个例外: fetchSomething.enqueue(new Callback() { @Override public void onResponse(Call call, Response response) { //Closes the response body response.raw().body().close(); //<— gives illegalStateException } @Override public void onFailure(Call call, Throwable t) { } }); } 我该如何关闭它?

在Espresso测试下的活动中进行的无效或覆盖API调用

我有一个Activity ,它在onCreate()生命周期方法中执行API调用。 如果此调用失败(在调试或测试环境中通常会失败), ViewStub被充气,充当错误屏幕。 此ViewStub涵盖Activity的其余部分。 这会在使用Espresso执行UI测试时导致问题。 我希望能够取消或控制此请求的结果,以便我可以为它编写可预测的测试。 以下是Activity的API代码: @Override protected void onCreate(@Nullable Bundle savedInstanceState) { // … // Perform call viewModel.loadStuff() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .doOnSubscribe(disposable -> progressBar.setVisibility(View.VISIBLE)) .doOnComplete(() -> progressBar.setVisibility(View.GONE)) .subscribe(response -> { // Success // … }, throwable -> { // Fail throwable.printStackTrace(); errorStub.inflate(); }); } 我写的一个Espresso测试是在几秒钟后测试此Activity按钮的启用状态。 但是,由于上述API调用在测试时失败, ViewStub会覆盖该按钮,测试失败。 我已经尝试通过脚本化自定义成功响应来实现OkHTTP3的MockWebServer (注意应用程序使用Retrofit,而不是直接使用OkHTTP)。 但是,似乎要使用MockWebServer您必须使用它返回的自定义URL,并让您的应用程序代码使用该URL进行调用。 这意味着修改应用程序代码以适应测试代码,这是没有意义的。 我也听说过自定义Dagger设置来解决这个问题。 问题: […]

在改造中获得401未经授权,但在Postman和Swift中工作

在’技术的东西’前简要介绍 使用Retrofit并不陌生,但遇到了这种奇怪的行为,我很难理解和修复,我有两个网络服务,在Postman和iOS中都可以正常工作,但只有一个在Retrofit而不是其他工作, 在我的辩护中,我可以说我得到(未经授权)响应,这意味着我能够击中服务器并获得结果 在API开发人员的辩护中,他说它适用于Postman和其他设备,因此不是服务问题 如果有任何Retrofit专家告诉我为了得到这个错误,我背后可能会做什么改造? 技术人员 谈到服务types,它包含授权承载令牌作为标题,每6个小时到期并且根本不包含参数(所以它应该很简单,对吧?)和一个简单的URL http://hashchuna.nn-assets.com / API /位置 遗憾的是,标头令牌无法与有效密钥共享,因为它在任何人都可以尝试之前就已过期,但无论如何它都是授权承载3d44626a55dbb024725984e0d37868336fd7e48a 我做了什么 我使用okhttp拦截添加授权标头来请求使用addHeader / header方法,url中没有空格cos没有参数 在改造中获得401未经授权的错误? Java:Android:Retrofit – 使用Call但响应{code = 401,message = unauthorized} https://github.com/square/retrofit/issues/1290 但他们没有帮助 警告 现在要记住这个棘手的部分,令牌在过期时必须给出401错误,这是预期的,但问题是即使对于新创建的令牌我得到401,这是我的核心问题 LOG D/OkHttp: –> GET http://hashchuna.nn-assets.com/api/locations http/1.1 D/OkHttp: Authorization: Bearer 7c0d53de006b6de931f7d8747b22442354cecef9 D/OkHttp: –> END GET D/OkHttp: <– 401 Unauthorized http://hashchuna.nn-assets.com/api/locations (773ms) D/OkHttp: Date: Mon, 20 Feb 2017 10:44:11 […]

OkHttpClient在更新Retrofit到Retrofit 2后损坏

从改造到改造2更新后出现此错误。 致命exception:OkHttp Dispatcher进程:nz.co.datacom.mars.junction,PID:21616 java.lang.NoSuchMethodError:类Lokhttp3 / internal / Platform中没有虚方法日志(Ljava / lang / String;)V; 或其超级类(’okhttp3.internal.Platform’的声明出现在/data/app/nz.co.datacom.mars.junction-1/base.apk中) 在okhttp3.logging.HttpLoggingInterceptor $ Logger $ 1.log(HttpLoggingInterceptor.java:109)okhttp3.logging.HttpLoggingInterceptor.intercept(HttpLoggingInterceptor.java:157)okhttp3.RealCall $ ApplicationInterceptorChain.proceed(RealCall.java:190)at okhttp3 .halCall.getResponseWithInterceptorChain(RealCall.java:163)at okhttp3.RealCall.access $ 100(RealCall.java:30) 在okhttp3.RealCall $ AsyncCall.execute(RealCall.java:127) 在okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:588)at java.lang.Thread.run(Thread.java:818) ) 我在应用程序中使用的libs版本是: compile ‘com.squareup.okhttp3:okhttp:3.2.0’ compile ‘com.squareup.okhttp3:okhttp-urlconnection:3.2.0’ compile ‘com.squareup:otto:1.3.7’ compile ‘com.google.code.gson:gson:2.6.2’ compile ‘com.squareup.retrofit2:retrofit:2.1.0’ compile ‘com.squareup.retrofit2:converter-gson:2.1.0’ compile ‘com.squareup.okhttp3:logging-interceptor:3.2.0’ 不确定是否是因为okhttp版本,但我尝试了2.3.0和3.4.0之间的几个不同的版本,但没有一个工作。 有任何想法吗? 提前致谢。

当代码为401时,如何在okhttp中获取响应体

我正在使用okHttp 3.2.0,这里是构建请求对象的代码 MediaType JSON = MediaType.parse(AppConstants.CONTENT_TYPE_VALUE_JSON); RequestBody body = RequestBody.create(JSON, requestBody); HttpUrl url = new HttpUrl.Builder() .scheme(“http”) .host(“192.168.0.104”) .port(8080) .addPathSegment(“mutterfly-server”) .addPathSegment(“j_spring_security_check”) .addQueryParameter(“j_username”, jsonObject.getString(“emailId”)) .addQueryParameter(“j_password”, jsonObject.getString(“password”)) .build(); request = new Request.Builder() .addHeader(AppConstants.CONTENT_TYPE_LABEL, AppConstants.CONTENT_TYPE_VALUE_JSON) .addHeader(AppConstants.ACCEPT_LABEL, AppConstants.CONTENT_TYPE_VALUE_JSON) .url(url) .post(body) .build(); 以下是我如何解析响应 client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, […]

Android java.security.cert.CertPathValidatorException:找不到证书路径的信任锚

Android应用程序有三个主机进行身份validation和授权。 最终主机是REST API。 这是第一次使用Oauth身份validation和授权过程,它可以正常运行。 但是,如果用户在登录后杀死应用程序并访问REST API提供的服务,然后再次打开应用程序,则会出现此问题。 在这种情况下,身份validation和授权过程不会发生,只有REST API。 它导致java.security.cert.CertPathValidatorException 但它在第一次使用时工作(登录然后使用应用程序)。 有人可以解释这个exception背后的情况,并且该应用程序有什么问题。 如果根据此SO答案忽略认证例外,则此方法有效。 SSLSocketFactory sslSocketFactory = null; try { TrustManagerFactory tmf = TrustManagerFactory.getInstance( TrustManagerFactory.getDefaultAlgorithm()); // Initialise the TMF as you normally would, for example: try { tmf.init((KeyStore)null); } catch(KeyStoreException e) { e.printStackTrace(); } TrustManager[] trustManagers = tmf.getTrustManagers(); final X509TrustManager origTrustmanager = (X509TrustManager)trustManagers[0]; // Create a trust […]

将cookie添加到客户端请求OkHttp

所以我开始使用Okhttp 3,网上的大多数例子都是关于旧版本的 我需要向OkHttp客户端请求添加一个cookie,如何用OkHttp 3完成? 在我的情况下,我只是想静态地将它添加到客户端调用而不从服务器接收它

几个新的Proguard在Multidex项目中发布了Google Play服务v10.2.6到v11.0.0

我更新了我们的应用程序以使用最新的Android Firebase SDK v11.0.0( https://firebase.google.com/support/release-notes/android#20170607 ),突然出现了一堆新的proguard错误,FYI在使用proguard之前,一切都运转良好。 之前: compile ‘com.google.firebase:firebase-messaging:10.2.6’ compile ‘com.google.android.gms:play-services-vision:10.2.6’ 后: compile ‘com.google.firebase:firebase-messaging:11.0.0’ compile ‘com.google.android.gms:play-services-vision:11.0.0’ 问题是它似乎并不是一个简单的新缺失的proguard条目,但它似乎打破了整个事情,突然其他几个库似乎受到这种变化的影响。 这些是与GMS相关的Proguard问题: Note: the configuration keeps the entry point ‘com.google.android.gms.ads.identifier.AdvertisingIdClient { com.google.android.gms.internal.zzfd zza(android.content.Context,com.google.android.gms.common.zza); }’, but not the descriptor class ‘com.google.android.gms.common.zza’ Note: the configuration keeps the entry point ‘com.google.android.gms.flags.impl.FlagProviderImpl { void init(com.google.android.gms.dynamic.IObjectWrapper); }’, but not the descriptor class ‘com.google.android.gms.dynamic.IObjectWrapper’ Note: […]

如何在OkHttp中为数据流编写重试拦截器?

或者认为此场景的拦截器适用? 我们的应用程序使用OkHttp下载文件(应用程序的新版本,每日数据库等) 有时服务器在app流式传输字节时失败(顺便问题是,recvfrom失败:ECONNRESET) 所以为了解决这个问题,我只想编写OkHttp重试拦截器。 但似乎这适用于不流式传输的操作。 是否有解决方案(如拦截器)来处理这种情况? 要做更清楚的阐述 0%============================== 100%( 刚开始流式传输) 0% === ========================= 100%( 已完成10% ) 0% ====== ======================== 100%( 已完成20% ) 0% ====== ======================== 100%( ECONNRESET – 由同行重置连接 ) 就在这时,流媒体停止了。 我想从OkHttp那里得到的东西是认识到这种情况然后从头开始流(而不是20%) 相关代码在这里,注意评论 Call call = client.newCall(new Request.Builder().url(url).get().build()); Response response = call.execute(); // PROBLEM DOES NOT OCCUR THERE // PROBLEM DOES NOT OCCUR THERE // […]