2016-11-11 5 views
0

Добрый день, я недавно обновил свои библиотеки и обновил Retrofit и OkHttp. Новые версии, которые я использую, включают следующие: Импорт/версии:Почему мой веб-запрос получает Усечение при использовании новейших версий Retrofit/OkHttp

1) Gson - компилировать 'com.google.code.gson: gson: 2,7'

2) OkHttp - компилировать «com.squareup.okhttp3: okhttp: 3.4.1'

3) okHttp Logging - компилировать 'com.squareup.okhttp3: протоколирования-перехватчик: 3.4.1'

4) Переоборудование - компилировать «com.squareup.retrofit2: модифицированная: 2,1 .0 '

5) Дооснащение 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; 
    } 
} 

My дооснащения Service Interface:

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 в базовой строке api никогда не отправляется. Я читаю через мой 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? должен ли я добавлять заголовок к этому конструктору запросов (если у перехватчика уже есть заголовки)? – antroid

Смежные вопросы