Retrofit2 响应格式错误

3

我已经尝试了一些不同的方法,但都没有成功,所以我想换另一个库尝试,但是为了保险起见,我还是先把它放在这儿。

我的应用程序向3个不同的URL发起2个GET请求和2个POST请求,我现在遇到了最后一个的问题。

我有一个Retrofit POST方法:

@Headers({
            "Accept: text/html",
            "Accept-Encoding: gzip, deflate, br",
            "Accept-Language: es-ES,es;q=0.8",
            "Cache-Control: no-cache",
            "Content-Type: application/x-www-form-urlencoded"
    })
    @FormUrlEncoded
    @POST("index.php?operacion=consulta")
    Call<String> postRaiaSearch(@Header("Cookie") String cookie, @Field("microchip") String microchip);

在我解释问题之前,我想澄清一点,我已经尝试过将Call<String>更改为Call<ResponseBody>,或者将有效负载作为@Field(使用@FormUrlEncodedContent-Type标头作为application/x-www-form-urlencoded)发送,也可以像@BodyRequestBody一样发送。

但是所有这些都会给我返回相同的错误格式响应。

这里是Advanced REST Client响应正常格式化的示例:

RAW: enter image description here

PARSED: enter image description here

而Retrofit给我的结果如下:

enter image description here

您可以看到,第一个不好的事情是网站返回的是HTML而不是JSON,但我认为我可以将其作为纯文本获取,但这并没有成功。

如果您想知道,这是我创建Retrofit对象的方式:

public static Retrofit getRaiaApi() {
    if (raiaRetrofit == null) {
        raiaRetrofit = new Retrofit.Builder()
                .baseUrl(RAIA_URL)
                .addConverterFactory(ScalarsConverterFactory.create())
                .build();
    }
    return raiaRetrofit;
}

我还尝试过添加 .addConverterFactory(GsonConverterFactory.create()),或删除 Scalars 行(只保留 Gson 行),甚至只删除它们两个都行。

我认为你并不需要调用那个 POST 方法的方法,但是我还是会把它粘贴在这里:

private void nextRaiaSearch(String header) {
    callRaiaSearch = apiInterfaceRaia.postRaiaSearch(header, chipInput);
    callRaiaSearch.enqueue(new Callback<String>() {
        @Override
        public void onResponse(Call<String> call, Response<String> response) {
            Log.v("call", "onResponse");
            Log.v("call", response.body());
        }

        @Override
        public void onFailure(Call<String> call, Throwable t) {
            Log.v("call", "onFailure");
        }
    });
}

我应该尝试像Volley或其他东西一样来代替Retrofit处理这个请求吗?

导入的内容如下:

compile 'com.google.code.gson:gson:2.8.2'
compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
compile 'com.squareup.retrofit2:converter-scalars:2.3.0'

你正在使用哪种类型的API(向服务器发送数据或从服务器接收数据)GET还是POST? - Khushdeep Kaur
这是一个POST请求,我想要响应,所以需要接收,但主要问题是该网站没有API,因此它会给你整个HTML页面,我很乐意接受它,可以从中提取我想要的值,但你可以看到Android给我的格式,充满了钻石和问号。 - JMedinilla
我可以问一下,为什么您将请求的内容类型设置为“Content-Type: text/plain”,并添加Gson转换器吗?难道不应该是默认情况下Retrofit放置的“Content-Type: application/json”吗? - Fred
我已经尝试过使用 text/plainapplication/jsonapplication/x-www-form-urlencoded,并为每个解决方案使用了不同的转换器。 - JMedinilla
在这篇文章中,使用了几种方法来发送数据:<key, value>、jsonbody和form-data。请问您使用哪一种方法?或者请检查API接受的格式并回复。 - Khushdeep Kaur
1个回答

2

好的,我有一个解决方案来处理我收到的响应混乱问题。问题在于POST方法的其中一个头文件:

Accept-Encoding: gzip, deflate, br

我被告知要放置该头文件,但实际上我根本不需要它,因为它会压缩文本。现在我可以获得正常的响应答案,就像在原始的Advanced REST Client响应中一样:

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接