2016-11-11 73 views
0

美好的一天,我最近更新了我的库并升级了Retrofit和OkHttp。我使用的新版本包括这些进口/版本:为什么我的Web请求在使用最新版本的Retrofit/OkHttp时被截断

1)GSON - 编译 'com.google.code.gson:GSON:2.7'

2)OkHttp - 编译“com.squareup.okhttp3: okhttp:3.4.1'

3)okHttp记录 - 编 'com.squareup.okhttp3:测井拦截:3.4.1'

4)改造 - 编译“com.squareup.retrofit2:改型:2.1 .0'

5)Retrofit Gson Converter - 编译'com.squareup.retrofit2:converter-gson:2.0.0-b eta3'

我不得不改变我的一些实际调用的结构,但除此之外,我的代码基本上与它们从这些库的早期版本(Retrofit/OkHttp 1)保持一致。

我遇到的问题是,当我发送出站呼叫时,它本质上是'忽略'路径的注释。

我改造客户端类:

import com.google.gson.GsonBuilder; 
import com.google.gson.annotations.SerializedName; 
import java.io.IOException; 
import java.security.KeyManagementException; 
import java.security.KeyStore; 
import java.security.KeyStoreException; 
import java.security.NoSuchAlgorithmException; 
import java.util.Arrays; 
import java.util.concurrent.TimeUnit; 
import javax.net.ssl.SSLContext; 
import javax.net.ssl.SSLSocketFactory; 
import javax.net.ssl.TrustManager; 
import javax.net.ssl.TrustManagerFactory; 
import javax.net.ssl.X509TrustManager; 
import okhttp3.Interceptor; 
import okhttp3.OkHttpClient; 
import okhttp3.Request; 
import okhttp3.Response; 
import okhttp3.logging.HttpLoggingInterceptor; 
import retrofit2.GsonConverterFactory; 
import retrofit2.Retrofit; 

public class RetrofitClient { 

    private static RetrofitService serviceClient; 

    private static final String BASE_URL = "api.myapiurl.com"; 
    private static HttpLoggingInterceptor.Level httpLogLevel = HttpLoggingInterceptor.Level.BODY; 

    static { 
     buildAClient(); 
    } 

    public static RetrofitService getServiceClient(){ 
     return serviceClient; 
    } 

    private static void buildAClient(){ 

     Interceptor interceptor = new Interceptor() { 
      @Override 
      public Response intercept(Interceptor.Chain chain) throws IOException { 
       Request.Builder builder = new Request.Builder(); 
       Request original = chain.request(); 
       builder.url(BASE_URL); 
       builder.addHeader("Content-Type", "application/json"); 
       builder.method(original.method(), original.body()); 
       Request newRequest = builder.build(); 
       return chain.proceed(newRequest); 
      } 
     }; 
     HttpLoggingInterceptor logging = new HttpLoggingInterceptor(); 
     logging.setLevel(httpLogLevel); 

     OkHttpClient.Builder builder = new OkHttpClient.Builder(); 
     builder.readTimeout(60, TimeUnit.SECONDS); 
     builder.writeTimeout(60, TimeUnit.SECONDS); 
     builder.addInterceptor(interceptor); 
     builder.addInterceptor(logging); 
     builder = configureClient(builder); 

     OkHttpClient client = builder.build(); 

     Retrofit.Builder myBuilder = new Retrofit.Builder(); 
     myBuilder.baseUrl(BASE_URL); 
     Gson gson = new GsonBuilder() 
       .setLenient() 
       .setPrettyPrinting() 
       .create(); 
     GsonConverterFactory factory = GsonConverterFactory.create(gson); 
     myBuilder.addConverterFactory(factory); 
     myBuilder.client(client); 
     Retrofit retrofit = myBuilder.build(); 
     serviceClient = retrofit.create(RetrofitService.class); 

    } 


    /** 
    * {@link okhttp3.OkHttpClient.Builder} <-- sslSocketFactory 
     */ 
    private static OkHttpClient.Builder configureClient(final OkHttpClient.Builder builder) { 
      TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(
        TrustManagerFactory.getDefaultAlgorithm()); 
      trustManagerFactory.init((KeyStore) null); 
      TrustManager[] trustManagers = trustManagerFactory.getTrustManagers(); 
      if (trustManagers.length != 1 || !(trustManagers[0] instanceof X509TrustManager)) { 
       throw new IllegalStateException("Unexpected default trust managers:" 
         + Arrays.toString(trustManagers)); 
      } 
      X509TrustManager trustManager = (X509TrustManager) trustManagers[0]; 

      SSLContext sslContext = SSLContext.getInstance("TLS"); 
      sslContext.init(null, new TrustManager[]{trustManager}, null); 
      SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory(); 

      builder.sslSocketFactory(sslSocketFactory, trustManager); 
     return builder; 
    } 
} 

我的改造服务接口:

public interface RetrofitService { 
    //Version Strings 
    public static final String VERSION2 = "/v2"; 

    //Returns a list of Order Objects 
    @GET(VERSION2 + "/orders/{orderId}/getOrder") 
    Call<Order> getOrder(@Path("orderId") String orderId, 
         @Query("key") String apiKey 
    //I'm aware this is bad practice ^^, already spoke with server dev 
    ); 

} 

的实际外呼我提出的是:

public static Order getSingleOrder(String orderId, String apiKey) { 

     Call<Order> call = myService.getOrder(orderId, apiKey); 

     Order toReturn = null; 

     try { 
      Response response = call.execute(); 
      toReturn = (Order) response.body(); 
     } catch (IOException ioe){ 
      ioe.printStackTrace(); 
     } 
     return toReturn; 
} 

虽然这一切工作过去很好,现在不再使用更新的库了。问题是,它是“忽略”的路径,这样,而不是发送这一呼吁:

GET请求:http://api.myapiurl.com/orders/12345/getOrder?key=54321

它现在提出这个要求:

GET请求:http://api.myapiurl.com/

就是这样。 .com之后的任何内容都不会被发送。我读通过我的logcat和随后OkHttp日志报表,看看那里的调用失败:

样品:

--> GET http://api.myapiurl.com/ http/1.1 
--> END GET 

没有人有任何想法,为什么当它工作得很好我更新之前,这是怎么回事?

感谢您的帮助!

回答

2

你在你的拦截重置您的网址 -

  Request.Builder builder = new Request.Builder(); 
      Request original = chain.request(); 
      builder.url(BASE_URL); <--!!! resets the request url to the base URL 
      builder.addHeader("Content-Type", "application/json"); 
      builder.method(original.method(), original.body()); 
      Request newRequest = builder.build(); 
      return chain.proceed(newRequest); 

尝试从代替现有请求抓住一个建设者 -

  Request original = chain.request(); 
      Request.Builder builder = original.newBuilder(); 
      builder.addHeader("Content-Type", "application/json"); 
      Request newRequest = builder.build(); 
      return chain.proceed(newRequest); 
+0

这完全解决了这个问题,非常感谢你的帮帮我。我错过了原文。newBuilder()行,因为运行它作为一个新的实例化的构建,而不利用原来的是造成运行时异常,并提到我需要设置builder.url。现在更改为您的代码后,我不仅看不到该运行时异常,而且也没有URL被截断/重置。万分感谢! – Silmarilos

+0

非常感谢它为我节省了一堆时间,但实际的GET请求看起来如何?我应该为这个requestbuilder添加头文件(假设拦截器已经添加了头文件)? – antroid

相关问题