2017-02-13 19 views
9

(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 headerscookies: 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&#58;&#47;&#47;&#37;5bNo&#37;20Host&#37;5d&#47;jsc&#47;xp2&#47;fns&#46;vast&#63;", is invalid.<p> 
D/OkHttp: Reference&#32;&#35;9&#46;756f87dd&#46;1487483027&#46;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.

+0

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

+1

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

+0

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

Trả lời

1

tôi nghĩ rằng nó là tốt hơn để cho phép khai thác gỗ trong OkHttp và kiểm tra xem

  1. url yêu cầu là đúng
  2. nhận dữ liệu là đúng quá. Thông tin

Thông tin thêm về làm thế nào để kích hoạt tính năng OkHttp loggin có thể được tìm thấy ở đây: https://github.com/square/okhttp/tree/master/okhttp-logging-interceptor

+0

Lời cảm ơn đầu tiên. Tôi thực sự đã thực hiện ghi chặn đánh chặn nhưng không tìm thấy cái gì đó đã giúp tôi giải quyết vấn đề. Thực tế là cùng một 'url' làm việc hoàn hảo khi được sử dụng chỉ với' OkHttp' nhưng không phải những gì tôi đã thử với 'retrofit' là những gì tôi không thể unserstand. – yshahak

Các vấn đề liên quan