使用改造从服务器取回列表
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.
我刚开始在 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.