标签: okhttp

OkHttp - 启用日志

我使用Retrofit来发出Http请求和Json解析,我喜欢打开调试日志的方法.日志允许查看正文请求,网址...这非常有用.由于Retrofit使用OkHttp,我想知道OkHttp是否也有办法为每个请求启用日志.

android web-services http okhttp

18
推荐指数
4
解决办法
2万
查看次数

Android在OKHttp中启用TLSv1.2

我正在使用OKHttp进行我的项目.我想为我的服务电话启用TLSv1.2.任何人都可以告诉我如何启用它.

ssl android okhttp

18
推荐指数
3
解决办法
2万
查看次数

如何将Okhttp的响应转换为输入流

码:

  public static String getRequestNoPayload(String urlString, String loginApi, String mUsername) throws Exception {
        Response response;
        try{
            client.setConnectTimeout(20, TimeUnit.SECONDS); // connect timeout
            client.setReadTimeout(20, TimeUnit.SECONDS);    // socket timeout
            Request request = new Request.Builder()
                    .url(urlString)
                    .addHeader("username",loginApi)
                    .addHeader("password",mUsername)
                    .build();

            response = client.newCall(request).execute();

        }catch(Exception e){
            throw e;
        }
        return response.body().string();
    }
Run Code Online (Sandbox Code Playgroud)

我想做什么: 我试图转换response.body()成一个inputstream.如何实现这一目标

android inputstream okhttp

18
推荐指数
1
解决办法
7055
查看次数

okhttp应用程序级别OkHttpClient实例

我想知道如果我创建一个OkHttpClient实例来服务我的"整个Android应用程序",是否会出现任何性能瓶颈或问题.即在我的Application类中,我创建了一个静态公共变量,它将包含一个OkHttpClient实例,每当我需要执行一个http请求时,我基本上构建一个请求对象,然后使用创建的okhttpclient实例来触发请求.

代码是这样的

public class MyApplication extends Application {
    public static OkHttpClient httpClient;

    @Override
    public void onCreate() {
        super.onCreate();

        httpClient = new OkHttpClient();
    }

}

// Making request 1
Request request1 = new Request.Builder().url(ENDPOINT).build();
Response response = MyApplication.httpClient.newCall(request1).execute();

// Making request 2
Request request2 = new Request.Builder().url(ENDPOINT).build();
Response response = MyApplication.httpClient.newCall(request2).execute();
Run Code Online (Sandbox Code Playgroud)

java okhttp

18
推荐指数
2
解决办法
7196
查看次数

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

我一直在努力让这个工作.我正在尝试使用自签名证书通过https连接到我的服务器.我不认为现在还没有任何页面或示例.

我做了什么:

  1. 按照本教程创建了bks密钥库:http://blog.crazybob.org/2010/02/android-trusting-ssl-certificates.html

它用于openssl s_client -connect domain.com:443从服务器获取证书.然后使用充气城堡创建一个bks密钥库.

  1. 从原始文件夹中读取创建的密钥库,将其添加到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);
            sslContext.init(null, trustManagerFactory.getTrustManagers(), null);
            return sslContext.getSocketFactory();
        } catch(Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    
    public CertificatePinner getPinnedCerts() {
        return new CertificatePinner.Builder()
                .add("domain.com", "sha1/theSha=")
                .build();
    } …
    Run Code Online (Sandbox Code Playgroud)

java ssl android okhttp

18
推荐指数
5
解决办法
3万
查看次数

读写超时行为

OkHttp中读写超时的行为是什么?

是整个请求超过超时持续时间时触发的超时异常,还是套接字在此期间未接收(读取)或发送(写入)任何数据包的情况.

我认为这是第二种行为,但有人可以澄清这一点吗?

提前致谢.

okhttp

18
推荐指数
1
解决办法
4821
查看次数

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

我正在使用改造.要捕获响应,我正在使用Interceptor:

OkHttpClient okHttpClient = new OkHttpClient();
okHttpClient.interceptors().add(myinterceptor);
Run Code Online (Sandbox Code Playgroud)

这是拦截器的代码:

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
Run Code Online (Sandbox Code Playgroud)

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

java android interceptor retrofit okhttp

18
推荐指数
3
解决办法
2万
查看次数

处理 Kotlin 协程中自定义 okhttp 拦截器抛出的异常

Interceptor在我的 Android 应用程序中使用自定义和 Retrofit 客户端,在某些特定情况下会引发异常。我正在尝试使用 Kotlin 协程使其工作。

问题是我无法处理前面提到的错误,因为在从 Interceptor 实例中抛出异常的那一刻,它会使整个应用程序崩溃,而不是在协程的try/catch语句中被捕获。当我使用 Rx 实现时,异常完美地传播到onError回调中,在那里我能够以我需要的方式处理它。

我想这与用于网络调用的底层线程有某种关系,请从调用的地方、在抛出异常之前的拦截器和堆栈跟踪中查看下面的日志:

2019-11-04 17:17:34.515 29549-29729/com.app W/TAG: Running thread: DefaultDispatcher-worker-1
2019-11-04 17:17:45.911 29549-29834/com.app W/TAG: Interceptor thread: OkHttp https://some.endpoint.com/...

2019-11-04 17:17:45.917 29549-29834/com.app E/AndroidRuntime: FATAL EXCEPTION: OkHttp Dispatcher
    Process: com.app, PID: 29549
    com.app.IllegalStateException: Passed refresh token can\'t be used for refreshing the token.
        at com.app.net.AuthInterceptor.intercept(AuthInterceptor.kt:33)
Run Code Online (Sandbox Code Playgroud)

我应该怎么做才能正确地从拦截器中捕获和处理这个异常?我错过了什么吗?

android exception interceptor okhttp kotlin-coroutines

18
推荐指数
2
解决办法
6203
查看次数

CertPathValidatorException 连接到 Android M 或更早版本上的 Let's Encrypt 主机

[编辑:如果您在这里参加 Let's Encrypt 从 2021 年 1 月开始的到期活动,请先阅读 https://letsencrypt.org/2020/12/21/extending-android-compatibility.html]

在 Android M 或更早版本上通过 OkHttp连接到https://valid-isrgrootx1.letsencrypt.org/失败,而连接在 N 或更高版本上工作。

    OkHttpClient client = new OkHttpClient();

    try {
      Request request = new Request.Builder()
              .url("https://valid-isrgrootx1.letsencrypt.org/robots.txt")
              .build();
      try (Response response = client.newCall(request).execute()) {
        assertTrue(response.code() == 200 || response.code() == 404);
        assertEquals(Protocol.HTTP_2, response.protocol());
      }
    } catch (SSLHandshakeException sslhe) {
      sslhe.printStackTrace();
    }
Run Code Online (Sandbox Code Playgroud)
javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:322)
at okhttp3.internal.connection.RealConnection.connectTls(RealConnection.java:320)
at okhttp3.internal.connection.RealConnection.establishProtocol(RealConnection.java:284)
at okhttp3.internal.connection.RealConnection.connect(RealConnection.java:169)
at okhttp3.internal.connection.StreamAllocation.findConnection(StreamAllocation.java:258)
at okhttp3.internal.connection.StreamAllocation.findHealthyConnection(StreamAllocation.java:135)
at okhttp3.internal.connection.StreamAllocation.newStream(StreamAllocation.java:114)
at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:42) …
Run Code Online (Sandbox Code Playgroud)

android okhttp lets-encrypt

18
推荐指数
2
解决办法
1098
查看次数

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

我正在开发一款需要客户端证书身份验证(包含PKCS 12文件)的Android应用.随着所有这些的弃用apache.http.*,我们已经开始在我们的网络层上进行重构,我们决定使用OkHttp作为替代品,到目前为止我非常喜欢它.

但是,我没有找到任何其他方法来处理客户端证书auth而不使用SSLSocketFactoryOkHttp或其他任何事情.那么在这种特殊情况下,最好的做法是什么?OkHttp有另一种方法来处理这种身份验证吗?

ssl android pkcs#12 sslsocketfactory okhttp

17
推荐指数
2
解决办法
2万
查看次数