2016-11-11 75 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

相關問題