Articles of okhttp

为WebTokenauthentication改装自定义客户端

我正在使用Retrofit来处理与服务器API,API用户JSON Web令牌进行身份validation的通信。 该令牌有时到期,我正在寻找实施改造客户端的最好方法,它可以在到期时自动刷新令牌。 这是我想到的初始实现,: /** * Client implementation that refreshes JSON WebToken automatically if * the response contains a 401 header, has there may be simultaneous calls to execute method * the refreshToken is synchronized to avoid multiple login calls. */ public class RefreshTokenClient extends OkClient { private static final int UNAUTHENTICATED = 401; /** […]

何时调用response.body()。close()

我有一个使用OkHttp的Android SDK。 在我的示例应用程序使用我的SDK一切工作正常。 然而,我的一个用户,当StrictMode打开时,得到以下的java.lang.Throwable: Explicit termination method 'close' not called 。 我已经尝试在我自己的应用程序与StrictMode复制这个,不要得到这个错误。 我明白,我应该调用response.body().close()但我仍然有点困惑,为什么这不是在我的应用程序中发生。 他发给我的堆栈跟踪只有我的类,所以它似乎没有任何东西在他的代码造成的。 另外值得注意的是,只有一个请求我的SDK实际上有响应读取。 但是这不是我的用户所说的引起exception的请求。 还有什么可能导致这个? 什么时候应该调用.close() ? 调用execute()后立即调用它是可取的吗? closures身体会阻止它在未来被阅读吗?

改造 – 太多的后续要求:21

我正在使用改造来提出请求。 我有以下错误: java.net.ProtocolException:太多的后续请求:21 代码如下所示: private OkHttpClient httpClient; private CookieManager cookieManager; public <S> S createCookieService(Class<S> serviceClass) { httpClient.interceptors().clear(); httpClient.setCookieHandler(cookieManager); Retrofit.Builder builder = new Retrofit .Builder() .client(httpClient) .baseUrl(url) .addConverterFactory(GsonConverterFactory.create()); Retrofit retrofit = builder.client(httpClient).build(); return retrofit.create(serviceClass); } 然后我提出要求: 例: 1)login @POST("/login") Call<User> login(); 2)一些要求: @GET("/request") Call<PojoPojo> getPojo(); 我得到这个错误太多的后续要求:21。 请帮忙。

OkHttpClient有一个最大重试计数

我正在为OkHttpClient设置连接失败的重试选项。 client = new OkHttpClient(); client.setRetryOnConnectionFailure(true); 我想知道它会继续尝试多less次。 看看源代码,我没有看到任何最大限​​制。 如何configuration客户端在几次尝试后停止尝试?

OKHttp中的参数在多部分窗体调用中的正确位置是什么?

我试图复制一个JPGfile upload使用OKHttp PHP服务器上的多部分forms。 我相信,我在错误的地方得到了一些参数,我不熟悉http中的多部分forms和命名。 这是我想要完成的 发布参数(名称值对):myuser,token,types为https://www.somesite.com/jpgphotoupload.php 然后,我使用POST方法创build一个多部分表单请求,使用以下命令:path: https : //www.somesite.com/jpgphotoupload.php 文件数据:大小为480 x 640的JPEG压缩图像数据(我知道) mimeType:image / jpeg (这个我明白) 不知道以下名称值对应作为多部分表单请求的一部分放在哪里,尝试了addFormDataPart 参数:再次参数表上面,(myuser,token,types) 名称:imagefile 文件名:myname.jpg 另外,这里还有什么可能是相关的 "Connection" , "Keep-Alive" "ENCTYPE", "multipart/form-data" "Content-Type", "multipart/form-data" 这是我目前的代码。 MediaType MEDIA_TYPE_JPG = MediaType.parse("image/jpg"); OkHttpClient client = new OkHttpClient(); RequestBody requestBody = new MultipartBuilder() .type(MultipartBuilder.FORM) .addPart( Headers.of("Content-Disposition", "form-data; name=\"imagefile\""), RequestBody.create(MEDIA_TYPE_JPG, new File("/storage/emulated/0/download/camerapic.jpg"))) .addFormDataPart("myuser", getprefmyuser(getBaseContext())) .addFormDataPart("token", […]

即使标题状态码是200,Retrofit也会调用failure()方法

我正在使用我的后端通信改造,并在我的改造呼叫片段下面: serverObject.createEvent(Utils.getAuthHeader(), params, new Callback<CreateEventResponse>() { @Override public void success(CreateEventResponse outputObj, retrofit.client.Response response) { Log.d(TAG, outputObj.getTitle() + " is successfully created."); setResult(Activity.RESULT_OK); finish(); } @Override public void failure(RetrofitError retrofitError) { //Header status code Log.e("failure", String.valueOf(retrofitError.getResponse().getStatus())); Log.e("failure", String.valueOf(retrofitError.getResponse().getBody())); } }); 上面的代码在Logcat中输出: 04-16 16:26:11.751 25131-25131/com.android.myapp.app E/failure﹕ 200 04-16 16:26:11.751 25131-25131/com.android.myapp.app E/failure﹕ null 谁可能呢? 任何机构请帮助为什么会发生这种情况。 另外我设置了setLogLevel(RestAdapter.LogLevel.FULL); 所以我可以看到我的logcat中的每个值。 我的回应来自服务器正确,但为什么失败()被调用? […]

如何提醒使用Toast的用户OkHttp请求返回了200以外的内容?

我正在使用OkHttp,一切工作正常,但是,我想考虑的情况下,DNSparsingclosures,服务器closures,速度慢,或只是返回一些HTTP状态代码200以外的东西。我试过使用吐司,但我不能因为这是在另一个线程(?)完成。 我如何克服这个障碍,给用户更好的体验? 这是我的代码: private void getBinary(String text) throws Exception { OkHttpClient client = new OkHttpClient(); String body = URLEncoder.encode(text, "utf-8"); // Encrypt MCrypt mcrypt = new MCrypt(); String encrypted = MCrypt.bytesToHex(mcrypt.encrypt(body)); Request request = new Request.Builder() .url("http://mysite/my_api.php") .post(RequestBody.create(MediaType.parse("text/plain"), encrypted)) .addHeader("User-Agent", System.getProperty("http.agent")) .build(); client.newCall(request).enqueue(new Callback() { @Override public void onResponse(Response response) throws IOException, RuntimeException { if […]

在Okhttp中处理身份validation

根据OKHttp文档,我使用OkHttp 2.3进行基本身份validation请求,它会自动重试未经身份validation的请求,但每当我提供无效的凭据时,请求将花费太多时间,最后得到此exception: java.net.ProtocolException:太多的后续请求:21 我怎样才能防止OkHttp自动重试未经身份validation的请求,并返回401 Unauthorized而不是?

改造2 / OkHttp:取消所有正在运行的请求

我使用OkHttp 2.7.0使用Retrofit 2-beta2。 为了从Retrofit中获得OkHttpClient对象,我使用了Retrofit .client()方法,并取消所有正在运行的请求,我将其称为cancel(Object tag)方法,但请求仍然继续运行,并得到响应。 在调用cancel()之后,即使客户端的Dispatcher的getQueuedCallCount()和getRunningCallCount()也返回0。 还有什么我需要做的这个工作? 或者可能是OkHttp中的一个错误? 作为一种解决方法,我在客户端的ExecutorService上调用shutdownNow() ,但我更喜欢一个更干净的解决scheme。

问题使用最新的广场 – 改造,okhttp,okio和okhttp-urlconnectionjar子

我介绍了下面的方形广口瓶为我正在处理的function: okttp-2.0.0 okhttp-的URLConnection-2.0.0.jar 奥基奥-1.0.0.jar 改装的1.6.1.jar 我从中央Maven回购下载这些。 一切工作正常本地,我把我的代码svn。 我们有一个Jenkins CI服务器来生成我们的debugging和发布版本。 这失败了。 我的本地环境和jenkins之间有许多不同: 本地我运行java 8,jenkins运行java 6 本地我只生成debugging版本,Jenkins生成debugging版本和发布版本 本地我有构build工具版本22.6.2,jenkins运行18.0.1 这些都是我在Jenkins日志中看到的问题: -compile: [javac] Compiling 545 source files to /var/lib/jenkins/jobs/Planner_4_10_Retrofit/workspace/Planner_4_10_Retrofit/bin/classes [javac] warning: /var/lib/jenkins/jobs/Planner_4_10_Retrofit/workspace/Planner_4_10_Retrofit/libs/okhttp-2.0.0.jar(com/squareup/okhttp/OkHttpClient.class): major version 51 is newer than 50, the highest major version supported by this compiler. [javac] It is recommended that the compiler be upgraded. [dex] Pre-Dexing /var/lib/jenkins/jobs/Planner_4_10_Retrofit/workspace/Planner_4_10_Retrofit/libs/okhttp-urlconnection-2.0.0.jar […]