(Sửa Tôi đã thêm một thử nghiệm trình diễn nhỏ)Retrofit2 phản ứng là yêu cầu xấu trong khi với OkHttp đang làm việc tốt
Tôi mới đến Retrofit
. Điều tôi cần làm là truy xuất tệp XML
từ máy chủ và chuyển đổi nó thành POJO. Vấn đề là mọi thứ hoạt động hoàn hảo với các tệp tĩnh trên máy chủ thử nghiệm của tôi, nhưng khi tôi đang thử trên máy chủ thực, tôi không thể làm việc với Retrofit2
, nhưng nó hoạt động khi tôi chỉ sử dụng trực tiếp với OkHttp
, vì vậy có điều gì đó sai với số Request
được tạo.
Chỉnh sửa: Tôi đã chuyển mã để sử dụng Trình biến đổi chuỗi thành những thứ đơn giản, vì vấn đề là độc quyền với phản hồi.
Đây là triển khai cơ sở của tôi.
public interface ZedoClient {
@retrofit2.http.Headers({
"User-Agent: Mozilla/5.0 (Linux; Android 5.1; Quattro_L50_HD LMY47D/Quattro_L50_HD)",
"Cookie : ZCBC=1;FFcat=3533,3,90;FFad=0;FFMChanCap=5345280B3533,3#2605191|0,1#0,24:"
})
@GET("fns.vast")
Call<Vast> getVast(@QueryMap(encoded=true) Map<String, String> options);
tôi bổ sung thêm hai Interceptor
để thiết lập các headers
và cookies
: AddCookiesInterceptor.class
class AddCookiesInterceptor implements Interceptor {
private final Headers headers;
AddCookiesInterceptor(Headers headers) {
this.headers = headers;
}
@Override
public okhttp3.Response intercept(Chain chain) throws IOException {
Request.Builder builder = chain.request().newBuilder();
builder.headers(headers);
return chain.proceed(builder.build());
}
}
ReceivedCookiesInterceptor.class
class ReceivedCookiesInterceptor implements Interceptor {
@Override
public okhttp3.Response intercept(Chain chain) throws IOException {
okhttp3.Response originalResponse = chain.proceed(chain.request());
if (!originalResponse.headers("Set-Cookie").isEmpty()) {
HashSet<String> cookies = new HashSet<>();
for (String header : originalResponse.headers("Set-Cookie")) {
cookies.add(header);
}
}
return originalResponse;
}
}
Và đây là bài kiểm tra tôi làm cho điều đó cho thấy cách với raw OkHttp
mọi thứ hoạt động như mong đợi, nhưng với retrofit2
nó thất bại:
public static Vast test(String baseUrl, Map<String, String> queryParams, final Headers headers) {
try {
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient httpClient = new OkHttpClient.Builder().addInterceptor(logging).build();
Request.Builder request = new Request.Builder()
.url("http://********/fns.vast?v=vast2&d=90&ct=mnf%3AKARBONN%5Emdn%3AQuattro_L50_HD%5Emdu%3AQuattro_L50_HD%5Etyp%3ASmartPhone%5Econ%3Awifi%5Eosn%3AAndroid%5Evsn%3A5.1%5Eosv%3A22%5Ecn%3AUS%5Elng%3Aen%5E&s=3&n=3533&c=3&z=0.4933822377892413");
if (headers != null) {
request.headers(headers);
}
okhttp3.Response oldRespnse = httpClient.newCall(request.build()).execute();
System.out.println("successsForOkhttp: " + oldResponse.isSuccessful());
OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder();
if (headers != null) {
clientBuilder.networkInterceptors().add(logging);
clientBuilder.networkInterceptors().add(new AddCookiesInterceptor(headers));
clientBuilder.networkInterceptors().add(new ReceivedCookiesInterceptor());
}
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
.client(clientBuilder.build())
.addConverterFactory(SimpleXmlConverterFactory.create())
.build();
ZedoClient client = retrofit.create(ZedoClient.class);
Call<Vast> call = client.getVast(queryParams);
Response<Vast> response = call.execute();
System.out.println("successsForRetrofit: " + response.isSuccessful());
if (response.isSuccessful()) {
return response.body();
} else {
MyLog.e("error:" + response.raw().message());
return null;
}
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
Đây là kết quả:
I/System.out: successsForOkhttp: true
I/System.out: successsForRetrofit: false
I/System.out: error:Bad Request
Như đã đề cập, tôi đã thêm Logging-Interceptor
cho cả hai, các OkHttp
yêu cầu và Retrofit2
yêu cầu, đây là kết quả:
D/OkHttp: --> GET http://**********/fns.vast?v=vast2&d=90&ct=mnf%3AKARBONN%5Emdn%3AQuattro_L50_HD%5Emdu%3AQuattro_L50_HD%5Etyp%3ASmartPhone%5Econ%3Awifi%5Eosn%3AAndroid%5Evsn%3A5.1%5Eosv%3A22%5Ecn%3AUS%5Elng%3Aen%5E&s=3&n=3533&c=3&z=0.4933822377892413 http/1.1
D/OkHttp: User-Agent: Mozilla/5.0 (Linux; Android 5.1; Quattro_L50_HD LMY47D/Quattro_L50_HD)
D/OkHttp: Cookie: ZCBC=1;FFcat=3533,3,90;FFad=0;FFMChanCap=5345280B3533,3#2605191|0,1#0,24:
D/OkHttp: --> END GET
D/OkHttp: <-- 200 OK http://**********/fns.vast?v=vast2&d=90&ct=mnf%3AKARBONN%5Emdn%3AQuattro_L50_HD%5Emdu%3AQuattro_L50_HD%5Etyp%3ASmartPhone%5Econ%3Awifi%5Eosn%3AAndroid%5Evsn%3A5.1%5Eosv%3A22%5Ecn%3AUS%5Elng%3Aen%5E&s=3&n=3533&c=3&z=0.4933822377892413 (720ms)
D/OkHttp: --> GET http://**********/fns.vast?v=vast2&d=90&ct=mnf%3AKARBONN%5Emdn%3AQuattro_L50_HD%5Emdu%3AQuattro_L50_HD%5Etyp%3ASmartPhone%5Econ%3Awifi%5Eosn%3AAndroid%5Evsn%3A5.1%5Eosv%3A22%5Ecn%3AUS%5Elng%3Aen%5E&s=3&n=3533&c=3&z=0.4933822377892413 http/1.1
D/OkHttp: User-Agent: Mozilla/5.0 (Linux; Android 5.1; Quattro_L50_HD LMY47D/Quattro_L50_HD)
D/OkHttp: Cookie : ZCBC=1;FFcat=3533,3,90;FFad=0;FFMChanCap=5345280B3533,3#2605191|0,1#0,24:
D/OkHttp: Host: xp1.zedo.com
D/OkHttp: Connection: Keep-Alive
D/OkHttp: Accept-Encoding: gzip
D/OkHttp: --> END GET
D/OkHttp: <-- 400 Bad Request http://**********/fns.vast?v=vast2&d=90&ct=mnf%3AKARBONN%5Emdn%3AQuattro_L50_HD%5Emdu%3AQuattro_L50_HD%5Etyp%3ASmartPhone%5Econ%3Awifi%5Eosn%3AAndroid%5Evsn%3A5.1%5Eosv%3A22%5Ecn%3AUS%5Elng%3Aen%5E&s=3&n=3533&c=3&z=0.4933822377892413 (208ms)
D/OkHttp: Server: ******Host
D/OkHttp: Mime-Version: 1.0
D/OkHttp: Content-Type: text/html
D/OkHttp: Content-Length: 272
D/OkHttp: Expires: Sun, 19 Feb 2017 05:43:47 GMT
D/OkHttp: Date: Sun, 19 Feb 2017 05:43:47 GMT
D/OkHttp: Connection: close
D/OkHttp: <HTML><HEAD>
D/OkHttp: <TITLE>Invalid URL</TITLE>
D/OkHttp: </HEAD><BODY>
D/OkHttp: <H1>Invalid URL</H1>
D/OkHttp: The requested URL "http://%5bNo%20Host%5d/jsc/xp2/fns.vast?", is invalid.<p>
D/OkHttp: Reference #9.756f87dd.1487483027.1f41287
D/OkHttp: </BODY></HTML>
Althogth cả hai cuộc gọi sử dụng cùng một GET
,Cuộc gọikhông thành công với 400. Có thể là một cái gì đó với Headers
hoặc cookie, nhưng tôi không thể thực hiện được.
bạn có thể chỉ cho phản ứng đầy đủ mà bạn nhận được khi làm theo yêu cầu với retrofit? Như nó đã được đề xuất dưới đây sử dụng ghi-đánh chặn cho việc này. – Divers
Tôi nghĩ rằng phản hồi của máy chủ với '400: yêu cầu không hợp lệ', có thể do tiêu đề hoặc cookie sai mà bạn vượt qua. – Divers
Tôi biết tôi đang nhận được 400, nhưng với cùng một tiêu đề tôi có 200 tốt respone với 'OkHttp' để chính xác những gì tôi muốn giải quyết ở đây – yshahak