我想解析與Retrofit和Gson的JSON文件。問題是URL接受參數forceDeviceId
。如果此值設置爲-111
,則可以恢復正確的文件。默認情況下,這個參數設置爲-1
和一個404錯誤被拋出:改造忽略查詢參數
我嘗試了兩種方法:硬編碼的API URL參數並使用查詢:
// either hardcoded in the URL
@GET("de/product/productlistajax.json?forceDeviceId=-111")
Call<ProductListParent> loadProductList(
@Query("categoryId") String categoryId,
@Query("sort") String sort,
@Query("lazyLoading") String lazyLoading,
// alternatively use this query
@Query("forceDeviceId") String forceDeviceId
);
但是這兩種方法都返回了404。所以我想知道我錯過了什麼讓它工作(就像它在瀏覽器中一樣)。我還認識到,在加載瀏覽器中的URL後,立即刪除該參數。那麼這是他們後端阻止的事情嗎?
這裏是方法,其中我打電話:
@Subscribe
public void getProductListRequest(MMSATServices.ProductListRequest request) {
final MMSATServices.ProductListResponse productListResponse = new MMSATServices.ProductListResponse();
productListResponse.productListParent = new ProductListParent();
Call<ProductListParent> call = liveApi.loadProductList(
request.categoryId, request.sort, request.lazyLoading, request.forceDeviceId);
call.enqueue(new Callback<ProductListParent>() {
@Override
public void onResponse(Call<ProductListParent> call, Response<ProductListParent> response) {
productListResponse.productListParent = response.body();
bus.post(productListResponse);
}
@Override
public void onFailure(Call<ProductListParent> call, Throwable t) {
t.printStackTrace();
}
});
}
這是錯誤消息我得到:
Response{protocol=http/1.1, code=404, message=Not Found, url=https://www.mediamarkt.de/de/product/productlistajax.json?categoryId=563612&sort=topseller&lazyLoading=true}
編輯:這裏是我創建的改造對象
private static Retrofit createMMSATService(String baseUrl) {
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(interceptor)
.cookieJar(new CustomCookieJar())
.build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.build();
return retrofit;
}
與CustomCookieJAr
類別:
public class CustomCookieJar implements CookieJar {
private List<Cookie> cookies = new ArrayList<>();
@Override
public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
if (cookies != null) {
this.cookies = cookies;
}
}
@Override
public List<Cookie> loadForRequest(HttpUrl url) {
return cookies;
}
}
正在討論的工作API和你從代碼中調用的API是不同的 –
我編輯了一下,我認爲它們應該是相同的。此外,如果你從錯誤消息中複製url,它將在瀏覽器中工作 – 4ndro1d