【问题标题】:How to get HTTP Response Error Code Doing OkHttp Sync Requests如何获取执行 OkHttp 同步请求的 HTTP 响应错误代码
【发布时间】:2023-03-20 11:21:01
【问题描述】:

我正在使用带有 Retrofit 的 OkHttp 来执行同步请求。问题是 OkHttp 抛出异常。我可以在拦截器中捕获异常,但响应为空。

我想根据 HTTP 响应代码向用户显示消息。

Response<List<Employee>> owner = null;
Call<List<Employee>> webCall = getWebService().getDeviceOwner("tolower(LoginId) eq tolower(\'" + SharedData.AuthorizationUserName + "\')");
try {
    owner = webCall.execute();
    if(isHttpResponseSuccess(owner.code())) {
        Employee employee = owner.body().get(0);
    }
    else {
        Log.e(TAG_NAME, "GetDeviceOwner() call failed. Http code=" + owner.code() + "/nMessage=" + owner.message());
}
catch (Exception e) {

   //Some type of network error.  401, etc?  I have no clue.
   Log.e(TAG_NAME, "GetDeviceOwner() exception=" + e);
}

客户端拦截器

_okHttpClient = new OkHttpClient.Builder()
                    .addInterceptor(
                            new Interceptor() {
                                @Override
                                public okhttp3.Response intercept(Interceptor.Chain chain) throws IOException {
                                    Request request = chain.request().newBuilder()
                                            .addHeader("Content-Type", "Application/JSON")
                                            .addHeader("Authorization", "Basic " + new String(Base64.encode((SharedData.AuthorizationUserName + ":" + SharedData.AuthorizationPassword).getBytes(), Base64.NO_WRAP)))
                                            .removeHeader("charset")
                                            .build();
                                    okhttp3.Response response = chain.proceed(request);
                                    Log.d(TAG_NAME, "Response code="+ response.code());
                                    Log.d(TAG_NAME, "Response="+ response.toString());
                                    return response;
                                }
                            }).addInterceptor(logging).build();

【问题讨论】:

标签: java android retrofit2 okhttp okhttp3


【解决方案1】:

你可以使用HttpResponse

HttpResponse httpResponse = client.newCall(request).execute(); 
httpResponse.getStatusLine().getStatusCode();

如果你使用的是 com.squareup.okhttp.Response 那么你可以使用 code() 方法。

Response httpResponse = client.newCall(request).execute(); 
httpResponse.code();

【讨论】:

  • 但是,我不需要在拦截器中执行 Interceptor.Chain.process(request) 来执行请求吗?
【解决方案2】:

你可以测试这段代码,当响应不是 2xx 时,你可以通过 e.getMessage() 获取代码;

_okHttpClient = new OkHttpClient.Builder()
                    .addInterceptor(
                            new Interceptor() {
                                @Override
                                public okhttp3.Response intercept(Interceptor.Chain chain) throws IOException {
                                    Request request = chain.request().newBuilder()
                                            .addHeader("Content-Type", "Application/JSON")
                                            .addHeader("Authorization", "Basic " + new String(Base64.encode((SharedData.AuthorizationUserName + ":" + SharedData.AuthorizationPassword).getBytes(), Base64.NO_WRAP)))
                                            .removeHeader("charset")
                                            .build();
                                    okhttp3.Response response = chain.proceed(request);
                                    if (response.code()/100!=2){
                                        throw new IOException(response.code()+"");
                                    }
                                    Log.d(TAG_NAME, "Response code="+ response.code());
                                    Log.d(TAG_NAME, "Response="+ response.toString());
                                    return response;
                                }
                            }).addInterceptor(logging).build();

【讨论】:

  • 它没有到达 response.code() 因为它在 okhttp3.Response response = chain.proceed(request); 处抛出异常;
猜你喜欢
  • 2019-02-25
  • 2014-10-09
  • 1970-01-01
  • 1970-01-01
  • 2013-03-15
  • 2021-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多