0

我是在 Android 中使用 Retrofit 网络的新手。到目前为止,我已经成功编写了将字符串发送到 PHP 服务器的代码。服务器配置为接受我的字符串,其中包含系统 ID 和密码(“systemid=id&password=password”)。通过这样的字符串附加参数可能看起来很奇怪,但这是我必须为这个项目做的方式。无论如何,在服务器上,如果发送给它的 id 和密码符合某些条件,它会发回一个文件位置列表。到目前为止,我从服务器得到了正确的响应。换句话说,“response.getMessage()”返回“OK”。但是我怎样才能得到服务器试图发回的列表呢?到目前为止,这是我的实现。

界面:

public interface ExampleClient {

    @POST("login/fake_name.php")
    Call<String> sendStringToServer(@Body String string);

}

这是我在活动中的代码:

private void sendRequestToServer(String str) {
        Retrofit.Builder builder = new Retrofit.Builder()
                .baseUrl("http://www.example.com/")
                .addConverterFactory(GsonConverterFactory.create());

        Retrofit retrofit = builder.build();

        PromoterKiosksClient client = retrofit.create(ExampleClient.class);
        Call<List<String>> call = client.sendStringToServer(str);
        call.enqueue(new Callback<Void>() {
            @Override
            public void onResponse(Call<String> call, Response<String> response) {
                Log.d(TAG, response.toString());
                Log.d(TAG, response.message());

            }

            @Override
            public void onFailure(Call<String> call, Throwable t) {
                Toast.makeText(AdminActivity.this, "you suck! keep trying", Toast.LENGTH_SHORT).show();
            }
        });
    }

onResponse() 中是否有我可以做到这一点的地方,还是我需要一个完全不同的实现?提前致谢

4

1 回答 1

1

你在找 response.body()吗?您是否从服务器收到 JSON 响应?如果是这样,您可以使用POJO来转换您的响应。你能在这里分享你的回应吗?您可以使用 POJO 转换您的结果并将其命名为 Result.java 并将其设置为您的返回类型。

private void sendRequestToServer(String str) {
        Retrofit.Builder builder = new Retrofit.Builder()
                .baseUrl("http://www.example.com/")
                .addConverterFactory(GsonConverterFactory.create());

        Retrofit retrofit = builder.build();

        PromoterKiosksClient client = retrofit.create(ExampleClient.class);
        Call<Result> call = client.sendStringToServer(str);
        call.enqueue(new Callback<Void>() {
            @Override
            public void onResponse(Call<Result> call, Response<Result> response) {
                Log.d(TAG, response.toString());
                Log.d(TAG, response.message());
                response.body(); // have your all data


            }

            @Override
            public void onFailure(Call<Result> call, Throwable t) {
                Toast.makeText(AdminActivity.this, "you suck! keep trying", Toast.LENGTH_SHORT).show();
            }
        });
    }

Call<User>对比Call<ResponseBody>对比Call<Void>

大多数端点将使用特定的返回类型声明,例如 Call。在这种情况下,Retrofit 将始终获取响应正文并尝试将其转换为 Java 对象。当然,这需要时间、内存和处理能力。

如果您可以不使用映射的 Java 对象,那么您应该选择 Call。这使您可以使用原始响应负载,但会跳过到 Java 对象的映射。使用此选项,您仍然有机会分析有效负载(例如 JSON)。

最有效的方法是调用,因为它不仅跳过了到 Java 对象的转换,而且还忽略了响应正文负载。当响应体非常大时(例如,较大的 JSON 或图像),您可以使用 Call 节省一点额外的时间和电池消耗。当然,这会导致响应对象的 body() 方法返回 null。

一个很好的例子来看看Consuming an API with retrofit 和 RXJava

于 2017-11-20T22:34:18.733 回答