Добрый день, я недавно обновил свои библиотеки и обновил 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
Кто-нибудь есть какие-либо идеи, почему это происходит, когда она работала хорошо, прежде чем я обновил?
Спасибо за помощь!
Это абсолютно решить проблему, спасибо большое за Помогите. Мне не хватало оригинала.newBuilder(), потому что запуск его как новой инстанцированной сборки без использования оригинала вызывал исключения во время выполнения и упоминал, что мне нужно установить builder.url. Теперь, изменив код, я не только не вижу этого исключения во время выполнения, но у меня также нет URL-адреса, который усекается/перезаписывается. Благодаря тонну! – Silmarilos
Спасибо большое Это спасло меня кучу времени, но как выглядит фактический запрос GET? должен ли я добавлять заголовок к этому конструктору запросов (если у перехватчика уже есть заголовки)? – antroid