使用改造从服务器取回列表

getting a List back from a server using retrofit

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

接口:

public interface ExampleClient {

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

}

这是我在 Activity 中的代码:

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() 的某处执行此操作,还是需要完全不同的实现?提前致谢

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

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>

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

如果没有映射的 Java 对象你也能生活,你应该选择调用。这使原始响应负载可供您使用,但会跳过到 Java 对象的映射。使用此选项,您仍然有机会分析有效载荷(例如,JSON)。

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

值得一看的好例子Consuming an API with retrofit and RXJava