Tag: okhttp

无法在Android 4.4 KitKat上快速关闭ChunkedInputStream

我有一个Android Daydream,使用Twitter4j的流媒体实现显示一条推文流。 这适用于Android 4.2和4.3。 但是在4.4上,我无法快速关闭流(在onDreamingStopped )。 我得到这个堆栈跟踪,但NetworkOnMainThreadException不是问题。 连接重用问题似乎与此问题有关。 这个OkHttp变更集 ( 在这里合并到Android中)改变了close在ChunkedInputStream行为方式。 如果还有更多要读取的数据,它现在尝试先丢弃流,以便快速重用套接字,而不是简单地将自己标记为“已关闭”,然后断开套接字。 如果它无法丢弃流,则会像以前一样断开套接字。 我现在得到NetworkOnMainThreadException的原因是(正如您从堆栈跟踪中看到的那样)丢弃流现在尝试从流中读取。 这很容易修复 – 我只是在关闭我的Daydream并将其忘记时将其放入AsyncTask 。 问题是在超时集内没有丢弃流。 查看最新版本源的HttpTransport#discardStream方法 ,它指定套接字上的100ms超时(原始提交指定30ms),然后尝试从流中读取( Util.skipAll )以清空缓冲区。 但是我看到BufferedInputStream.read()调用周围有多秒的延迟。 这种延迟的长度似乎有所不同。 这不是一个大问题 – 因为我现在必须从UI线程关闭此流,我不会导致onDreamingStopped调用需要很长时间才能返回(这导致白日梦停留在屏幕上按下/回家后很长一段时间 – 我最初的错误报告导致我跟随这个兔子洞。 但是,它确实会在关闭之后将此连接暂停一段时间。 我已经测试了使用两个不同活动级别的Twitter帐户关闭流所需的时间。 第一个在我试图关闭流时没有看到任何活动,我一直看到通话大约需要30秒。 第二个帐户有更多的活动,关闭流的时间在这个上更加多变 – 从1.5到30秒不等。 当一条新的推文进入时,它会立即关闭(一个新的块被写入流中)。 为什么我在关闭KitKat的流时遇到这种延迟? 为什么它不尊重正在设置的100ms超时? 这类似于Android KitKat HttpURLConnection断开AsyncTask – 虽然这可能是在引擎盖下使用FixedLengthInputStream ,但同样的更改已应用于该类的close方法。

如何在okhttp中将Charset自动添加到Content-Type中

请考虑以下代码: OkHttpClient client = new OkHttpClient(); MediaType mediaType = MediaType.parse(“text/plain; charset=utf-8”); // [A] RequestBody body = RequestBody.create(mediaType, media); String[] aclHeader = “x-goog-acl:public-read”.split(“:”); Request request = new Request.Builder() .addHeader(“Content-Type”, “text/plain”) // [B] .addHeader(aclHeader[0], aclHeader[1]) .url(url) .put(body) .build(); Response response = client.newCall(request).execute(); 我正在从客户端访问GCS,并使用以前签名的URL。 问题:似乎okhttp将为身体[A]声明的字符集添加到URL(至少对于text / plain),即使它未在[B]中声明。 这会弄乱我签名的URL,GCS会返回403 Forbidden。 如果我从[A]中删除字符集,它仍会被添加。 如果我在签名之前将charset添加到签名的URL,它就可以工作,GCS返回200 OK。 但这不是应该的。 至少在使用签名URL时,必须将这些URL完全按照声明的方式发送到服务器。 我尝试使用Apache http客户端(我不想在生产中使用,因为okhttpclient已经是我的安装的一部分)并且该客户端不会暴露这种行为: String[] aclHeader […]

okhttp客户端在TMG代理服务器下抛出exception

我正在为我的java应用程序使用github的方形OKHTTP客户端库,如下所示: import java.io.IOException; import java.net.InetSocketAddress; import java.net.Proxy; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSession; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; import com.squareup.okhttp.Authenticator; import com.squareup.okhttp.Credentials; import com.squareup.okhttp.OkHttpClient; import com.squareup.okhttp.Request; import com.squareup.okhttp.Response; public class TestOkHttp { static public void main(String argcp[]){ try { OkHttpClient okHttpClient = new OkHttpClient(); TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() […]

使用令牌和ID添加标头

我在获取经过身份validation的用户时遇到问题。 在它之前我得到了令牌和用户ID。 现在我需要使用访问令牌和id从服务器获取用户。 我有标题格式 现在我试图使用拦截器添加带有用户令牌和id的头。 我的代码: Interceptor interceptor = new Interceptor() { @Override public okhttp3.Response intercept(Chain chain) throws IOException { Request newRequest = chain.request().newBuilder() .addHeader(“Accept”, “application/json”) .addHeader(“authorization”, token) <-?? .addHeader("driver_id", id) <-?? .build(); return chain.proceed(newRequest); } }; OkHttpClient.Builder okHttpBuilder = new OkHttpClient.Builder(); okHttpBuilder.addInterceptor(interceptor); OkHttpClient okHttpClient = okHttpBuilder.build(); Retrofit retrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .client(okHttpClient) […]

OkHttpClient无法取消Call by tag

我最近升级到OkHttp3 ,并注意到您无法再直接从客户端取消标记。 这必须由应用程序现在处理。 这里以CHANGELOG为例 : 取消批量呼叫现在是应用程序的责任。 取消按标记调用的API已被删除,并替换为更通用的机制。 调度程序现在通过其runningCalls()和queuedCalls()方法公开所有正在进行的调用。 您可以编写通过标记,主机或其他任何方式选择调用的代码,并对不再需要的调用Call.cancel()。 我用我的简单实用工具方法自行回答这篇文章,以取消正在运行或排队的Call by tag。

在OkHttp中使用请求正文获取请求

我正在尝试将OkHttp 3.6.0与Elasticsearch一起使用,并且我坚持向Elasticsearch Multi GET API发送请求。 它需要向请求主体发送HTTP GET请求。 不幸的是,如果我自己尝试构建请求,OkHttp不支持开箱即用并抛出exception。 RequestBody body = RequestBody.create(“text/plain”, “test”); // No RequestBody supported Request request = new Request.Builder() .url(“http://example.com”) .get() .build(); // Throws: java.lang.IllegalArgumentException: method GET must not have a request body. Request request = new Request.Builder() .url(“http://example.com”) .method(“GET”, requestBody) .build(); 有没有机会在OkHttp中使用请求主体建立GET请求? 相关问题: 带请求正文的HTTP GET 如何在没有请求主体的情况下发出OKHTTP发布请求? 带有请求正文的Elasticsearch GET请求

改造和OkHttp gzip解码

我希望将REST服务作为gzip编码的JSON使用。 它提供了Content-Encoding: gzip ,但我的OkHttp没有将其编码为可读文本,因此JSON转换器抛出exception。 —> HTTP GET https://rapla.dhbw-karlsruhe.de/rapla/events?resources=%5B%27rc85dbd6-7d98-4eb7-a7f6-b867213c73d8%27%5D&start=2015-09-01&end=2015-12-31 Accept-Encoding: gzip, deflate Accept: application/json Authorization: *not posted* Content-Type: application/json;charset=utf-8 —> END HTTP (no body) 3m WMa ג ҵ p 0 S n <— END HTTP (9684-byte body) 根据Jake Whartons对Content-Encoding: gzip 评论 Content-Encoding: gzip Header应告诉OkHttp对身体进行解码。 创建RestAdapter的代码是: final RestAdapter adapter = new RestAdapter.Builder() .setEndpoint(baseUrl) .setClient(new OkClient(new OkHttpClient())) .setConverter(new […]

如何通过OkHttp将查询参数添加到HTTP GET请求?

我使用的是最新的okhttp版本: okhttp-2.3.0.jar 如何在java中的okhttp中向GET请求添加查询参数? 我发现了一个关于android的相关问题 ,但这里没有答案!

如何在listview中显示??(使用okhttp库)

@Override public void onResponse(final Response response) throws IOException {//okhttp onresponse method try { String json = response.body().string();//get data from cinemalytics Log.v(TAG, json);// if (response.isSuccessful()) { mCurrentmovie = getDATA(json); //mCurrentmovie is an object of Currentmovie getter and setter class. runOnUiThread(new Runnable() { @Override public void run() { String T = mCurrentmovie.getTitle(); tv.setText(T); //successfully show in single […]

OkHTTPClient代理validation如何?

问题:如何向OkHTTP添加授权代理。 我知道OkHTTP的构建器确实支持代理,尽管我很难设置代理 。 /** * Given a Url and a base64 encoded password return the contents of a website. * @param urlString * @param password * @return JSON */ public String getURLJson(String urlString, String password) { OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(60, TimeUnit.SECONDS) .writeTimeout(60, TimeUnit.SECONDS) .readTimeout(60, TimeUnit.SECONDS) .build(); Request request = new Request.Builder() .url(urlString) .get() […]