Articles of okhttp

如何在OkHttp响应中更改正文?

我正在使用改造。 要捕获响应,我正在使用Interceptor: OkHttpClient okHttpClient = new OkHttpClient(); okHttpClient.interceptors().add(myinterceptor); 这是拦截器的代码: new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); Response response = chain.proceed(request); if (path.equals(“/user”)){ String stringJson = response.body().string(); JSONObject jsonObject = new JSONObject(stringJson); jsonObject.put(“key”,1); //here I need to set this new json to response and then return this response […]

OkHttp javax.net.ssl.SSLPeerUnverifiedException:未validation主机名domain.com

我一直在努力让这个工作。 我正在尝试使用自签名证书通过https连接到我的服务器。 我认为现在还没有任何页面或示例。 我做了什么: 按照本教程创建了bks密钥库: http : //blog.crazybob.org/2010/02/android-trusting-ssl-certificates.html 它使用openssl s_client -connect domain.com:443从服务器获取证书。 然后使用充气城堡创建一个bks密钥库。 从原始文件夹中读取创建的密钥库,将其添加到sslfactory,然后再添加到OkHttpClient。 喜欢这个: public ApiService() { mClient = new OkHttpClient(); mClient.setConnectTimeout(TIMEOUT_SECONDS, TimeUnit.SECONDS); mClient.setReadTimeout(TIMEOUT_SECONDS, TimeUnit.SECONDS); mClient.setCache(getCache()); mClient.setCertificatePinner(getPinnedCerts()); mClient.setSslSocketFactory(getSSL()); } protected SSLSocketFactory getSSL() { try { KeyStore trusted = KeyStore.getInstance(“BKS”); InputStream in = Beadict.getAppContext().getResources().openRawResource(R.raw.mytruststore); trusted.load(in, “pwd”.toCharArray()); SSLContext sslContext = SSLContext.getInstance(“TLS”); TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); trustManagerFactory.init(trusted); […]

在Android上使用okhttp 2的持久Cookie存储

在我的Android应用程序中,我试图从android-async-http切换到支持异步网络sind版本2.0的okhttp 。 虽然前者发布了持久性cookie存储的实现 ,但我不知道如何为okhttp实现这样的东西。 在我的应用程序中,我有一个登录例程,在此期间发送一个get请求,如果成功,应该设置一个cookie。 此cookie应附加到所有后续网络请求,并应在应用程序重新启动后继续存在。 我在SO上find了以下答案 ,表明如果在应用程序的某处执行,下面的一段代码会激活持久性cookie管理, okhttp会使用它: CookieManager cookieManager = new CookieManager(); cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL); CookieHandler.setDefault(cookieManager); 但是,对我来说它不起作用。 CookieManager是正确的方法吗? 我如何监控设置和存储哪些cookie以进一步调试问题?

okhttp – 拦截器 – 阻止非致命exception被记录到Crashlytics

我在Android应用程序中使用Retrofit,这反过来意味着我使用OkHttp。 我刚刚去了阿尔法,并在我的崩溃报告中看到了一些非致命的exception被记录。 所有这些都源于我的okhttp拦截器,然后记录的exception似乎都是在网络可能不稳定或连接丢失等情况下有效的事情。 我怎样才能这样做,以便这些exception不会记录到崩溃关系中,从而混淆了我对应用程序中出现的exception的看法? 一些例外的例子: > Non-fatal Exception: javax.net.ssl.SSLHandshakeException Connection closed by peer okhttp3.internal.connection.RealConnection.connectTls (RealConnection.java:281) okhttp3.internal.connection.RealConnection.establishProtocol (RealConnection.java:251) okhttp3.internal.connection.RealConnection.connect (RealConnection.java:151) okhttp3.internal.connection.StreamAllocation.findConnection (StreamAllocation.java:192) okhttp3.internal.connection.StreamAllocation.findHealthyConnection (StreamAllocation.java:121) okhttp3.internal.connection.StreamAllocation.newStream (StreamAllocation.java:100) okhttp3.internal.connection.ConnectInterceptor.intercept (ConnectInterceptor.java:42) okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:92) okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:67) okhttp3.internal.cache.CacheInterceptor.intercept (CacheInterceptor.java:93) okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:92) okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:67) okhttp3.internal.http.BridgeInterceptor.intercept (BridgeInterceptor.java:93) okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:92) okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept (RetryAndFollowUpInterceptor.java:120) okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:92) okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:67) MY_INTERCEPTOR.intercept (AuthenticationInterceptor.java:30) 和 > Non-fatal Exception: javax.net.ssl.SSLException Read […]

证书固定不适用于Android上的OkHttp

在Android应用上使用com.squareup.okhttp:okhttp:2.4.0和com.squareup.retrofit:retrofit:1.9.0 ,尝试通过HTTPS与服务器REST API通信,该API使用自签名证书。 服务器密钥库具有私钥和2个证书,服务器和根证书。 openssl s_client输出 – Certificate chain 0 s:/C=…OU=Dev/CN=example.com i:/C=… My CA/emailAddress=info@example.com 1 s:/C=… My CA/emailAddress=info@example.com i:/C=… My CA/emailAddress=info@example.com 在Android应用程序中,OkHttp使用根证书的SHA1签名进行初始化 – CertificatePinner certificatePinner = new CertificatePinner.Builder() .add(“example.com”, “sha1/5d…3b=”) .build(); OkHttpClient client = new OkHttpClient(); client.setCertificatePinner(certificatePinner); RestAdapter restAdapter = new RestAdapter.Builder() .setEndpoint(“https://example.com”) .setClient(new OkClient(client)) .build(); 但是当尝试发送请求失败时会出现exception – retrofit.RetrofitError: java.security.cert.CertPathValidatorException: Trust anchor for certification path […]

改造ETAG和缓存

是否有关于如何向Retrofit + OkHttp添加缓存和ETAG / If-None-Match支持的正确解释? 我正在努力为2个项目添加Etag支持,起初我怀疑HTTP标头可能存在问题,另一个项目已正确设置,缓存仍无法按预期工作。 以下是我试图让它发挥作用。 结果显示缓存似乎在应用程序的同一个实例中工作,但是一旦我重新启动 – 一切都会再次加载。 此外,在我的日志中,我没有看到If-None-Match被添加到请求中,因此我假设服务器不知道ETag并且仍然完全重新计算响应。 以下是一些代码示例: public class RetrofitHttpClient extends UrlConnectionClient { private OkUrlFactory generateDefaultOkUrlFactory() { OkHttpClient client = new com.squareup.okhttp.OkHttpClient(); try { Cache responseCache = new Cache(baseContext.getCacheDir(), SIZE_OF_CACHE); client.setCache(responseCache); } catch (Exception e) { Logger.log(this, e, “Unable to set http cache”); } client.setConnectTimeout(READ_TIMEOUT, TimeUnit.MILLISECONDS); client.setReadTimeout(CONNECT_TIMEOUT, TimeUnit.MILLISECONDS); return new […]

Retrofit连接失败将RetrofitError.response返回为null

使用Retrofit 1.6.0,OkHTTP 2.0.0和OkHTTP-UrlConnection 2.0.0。 我正在使用Retrofit对不存在的URL进行服务POST。 正如预期的那样调用失败回调。 但是,RetrofitError参数没有响应。 我真的想抓住使用返回的HTTP状态代码 error.getResponse().getStatus() 但由于getResponse()返回null,我不能。 为什么getResponse()为null,如何获取状态? 谢谢。 此外,我收到的错误是UnknownHostException,如预期的那样。 重复:我期待这个错误。 我想知道如何获取HTTP状态代码或者为什么error.getResponse()返回null。 编辑:这是一些代码: RestAdapterBuilderClass.java RestAdapter restAdapter = new RestAdapter.Builder() .setEndpoint(“http://badURL.DoesntMatter/”); .setRequestInterceptor(sRequestInterceptor) .setLogLevel(RestAdapter.LogLevel.FULL) .build(); sService = restAdapter.create(ServiceInterface.class); ServiceInterface.java @POST(“/Login”) void login(@Body JsonObject body, Callback callback); CallbackClass.java @Override public void failure(RetrofitError error) { if (error.getResponse() == null) { // error.getResponse() is null when I […]

从资源上传okhttp的二进制文件

我需要使用okhttp将apk中捆绑的二进制文件上传到服务器。 使用urlconnection,您只需获取资产的输入流,然后将其放入您的请求中。 但是,okhttp只为您提供上传字节数组,字符串或文件的选项。 由于您无法获取apk中捆绑的资产的文件路径,因此将文件复制到本地文件目录的唯一选项(我宁愿不这样做)然后将文件提供给okhttp? 有没有办法简单地使用assetinputstream直接向Web服务器发出请求? 编辑:我使用了接受的答案,但我没有创建一个静态实用程序类,而只是将子类化为RequestBody public class InputStreamRequestBody extends RequestBody { private InputStream inputStream; private MediaType mediaType; public static RequestBody create(final MediaType mediaType, final InputStream inputStream) { return new InputStreamRequestBody(inputStream, mediaType); } private InputStreamRequestBody(InputStream inputStream, MediaType mediaType) { this.inputStream = inputStream; this.mediaType = mediaType; } @Override public MediaType contentType() { return mediaType; } @Override […]

既然在Android上不推荐使用SSLSocketFactory,那么处理客户端证书身份validation的最佳方法是什么?

我正在开发一款需要客户端证书身份validation(带有PKCS 12文件)的Android应用。 在所有apache.http.*被弃用之后,我们已经开始在我们的网络层上进行重构,我们决定使用OkHttp作为替代品,到目前为止我非常喜欢它。 但是,我没有find任何其他方法来处理客户端证书auth而不使用SSLSocketFactory ,OkHttp或其他任何事情。 那么在这种特殊情况下,最好的行动方案是什么呢? OkHttp还有另一种方法来处理这种身份validation吗?

如何使用OkHttp 2.0实现Android Volley?

OkHttp2.0不再支持此OkHttpStack: https ://gist.github.com/JakeWharton/5616899 将OkHttp 2.0.0与Volley集成的当前模式是什么?