仅改装2个响应主体内容物”<;html>";一串


Retrofit 2 response body contents only "<html>" string

我试图了解如何使用改装库,所以我创建了一个android项目和一个简单的php脚本。我的index.php文件位置是xampp的htdocs目录。

这是我的php脚本,这里我只想在脚本执行时返回一个字符串

<html>
 <head>
  <title>PHP Test</title>
 </head>
 <body>
 <?php  
    echo "Success";
 ?> 
 </body>
</html>

在android部分,我想发送一个GET请求

@GET("/")
Call<String> test();

在这里我发送响应并做必要的准备

Gson gson = new GsonBuilder()
                .setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ")
                .setLenient()
                .create();        
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://192.168.43.169:80/")
                .addConverterFactory(GsonConverterFactory.create(gson))
                .build();
        IDataSyncApi dataSyncApi = retrofit.create(IDataSyncApi.class);       
        Callback<String> callback = new Callback<String>() {
            @Override
            public void onResponse(Call<String> call, Response<String> response) {
                String responseStr = gson.fromJson(response.body().toString(), String.class);
                Log.d("RESPONSE", responseStr);
            }
            @Override
            public void onFailure(Call<String> call, Throwable t) {
            }
        };
        Call<String> response = dataSyncApi.test();
        response.enqueue(callback);

问题是Response的body总是等于"<html>"。我做错了什么?

更新1

我试着用维基百科的公共API代替我的,结果是一样的。我得到了"

 @GET("/w/api.php")
 Call<String> test(@QueryMap Map<String, String> argsMap);
Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("https://en.wikipedia.org/")
                .addConverterFactory(GsonConverterFactory.create(gson))
                .build();
Map<String, String> args = new HashMap<String, String>();
        args.put("action", "query");        
        args.put("meta", "siteinfo");
        args.put("siprop", "namespaces");
        Call<String> response = dataSyncApi.test(args);
        response.enqueue(callback);

我自己想出来的。问题是我使用String作为Call类(Call<String>)的类型。相反,最好使用Call<ResponseBody>,所以它变成这样:

服务

 @GET("/w/api.php")
 Call<ResponseBody> test(@QueryMap Map<String, String> argsMap);

提出请求

Call<ResponseBody> response = dataSyncApi.test(args);
        response.enqueue(callback);

您可以使用ResponseBody Type。如下所示:

@Multipart
@POST("/android_upload_file/uploadfile.php")
Call<ResponseBody> upload(@Part("fileName") String des, @Part("file'"; filename='"1.txt'"")RequestBody file);

您已经在Response<String> response中获得了作为字符串的响应。您尝试使用gson对其进行反序列化,这是针对jsons而非html的。

如果仍然不起作用,请尝试使用HttpLoggingInterceptor记录响应。

您确定请求的是正确的PHP文档吗?可能是XAMPP缓存了该文件,或者提供了另一个像index.html这样的文件?

或者,我会将PHP文件更改为使用JSON响应,并在您的改装调用中添加一个requestHeader以接受JSON(或HTML,具体取决于您的期望)