使用 Retrofit2 在 form-urlencoded 请求中发送对象列表
Sending list of objects in form-urlencoded request using Retrofit2
这是我的邮递员请求:
我将使用 Retrofit2、Gson 和 RxJava2 发送一个 POST 请求。这是我的要求:
@FormUrlEncoded
@POST("Student") // I'm sure the address and name are correct
Completable Student(@Field("firstName") String firstName,
@Field("lastName") String lastName,
@Field("exam[]") List<Exam> exams
);
这是使用 POJO 生成器创建的考试模型:
public class Exam {
@SerializedName("score")
private int score;
@SerializedName("field")
private String field;
public void setScore(int score){
this.score = score;
}
public int getScore(){
return score;
}
public void setField(String field){
this.field = field;
}
public String getField(){
return field;
}
@Override
public String toString(){
return
"Exam{" +
"score = '" + score + '\'' +
",field = '" + field + '\'' +
"}";
}
}
Postman 正确发送请求并收到响应码204 但我的Retrofit 请求无法正确发送请求。如何使用 Retrofit 版本 2 和 RxJava 版本 2 在 x-www-form-urlencoded 请求中发送对象列表?
也许你可以试试这个:
@FormUrlEncoded
@POST("Student") // I'm sure the address and name are correct
Completable Student(@Field("firstName") String firstName,
@Field("lastName") String lastName,
@FieldMap Map<String, String>
);
*****************************
// how to use the map
Map<String, String> params = new HashMap<>();
params.put("exam[0][field]","Math");
params.put("exam[0][score]","90");
params.put("exam[1][field]", "Physics");
params.put("exam[1][score]", "99");
如果 Postman 请求有效,那么这将是 Retrofit 等效项:
@FormUrlEncoded
@POST("Student")
Completable Student(@Field("firstName") String firstName,
@Field("lastName") String lastName,
@FieldMap Map<String, String> fieldMap
);
然后 运行 循环填写详细信息
public void sendRequest(List<Exam> exams) {
Map<String, String> map = new HashMap<>();
for (int i = 0; i < exams.size(); i++) {
map.put("exam[" + i + "].field", exams.get(i).getField());
map.put("exam[" + i + "].score", String.valueOf(exams.get(i).getScore()));
}
yourApiService.Student(firstName, lastName, map); // enqueue or execute whatever
}
这是一种更简单的方法,您还可以使用 Gson 查看自定义 JsonSerializer
。
这是我的邮递员请求:
我将使用 Retrofit2、Gson 和 RxJava2 发送一个 POST 请求。这是我的要求:
@FormUrlEncoded
@POST("Student") // I'm sure the address and name are correct
Completable Student(@Field("firstName") String firstName,
@Field("lastName") String lastName,
@Field("exam[]") List<Exam> exams
);
这是使用 POJO 生成器创建的考试模型:
public class Exam {
@SerializedName("score")
private int score;
@SerializedName("field")
private String field;
public void setScore(int score){
this.score = score;
}
public int getScore(){
return score;
}
public void setField(String field){
this.field = field;
}
public String getField(){
return field;
}
@Override
public String toString(){
return
"Exam{" +
"score = '" + score + '\'' +
",field = '" + field + '\'' +
"}";
}
}
Postman 正确发送请求并收到响应码204 但我的Retrofit 请求无法正确发送请求。如何使用 Retrofit 版本 2 和 RxJava 版本 2 在 x-www-form-urlencoded 请求中发送对象列表?
也许你可以试试这个:
@FormUrlEncoded
@POST("Student") // I'm sure the address and name are correct
Completable Student(@Field("firstName") String firstName,
@Field("lastName") String lastName,
@FieldMap Map<String, String>
);
*****************************
// how to use the map
Map<String, String> params = new HashMap<>();
params.put("exam[0][field]","Math");
params.put("exam[0][score]","90");
params.put("exam[1][field]", "Physics");
params.put("exam[1][score]", "99");
如果 Postman 请求有效,那么这将是 Retrofit 等效项:
@FormUrlEncoded
@POST("Student")
Completable Student(@Field("firstName") String firstName,
@Field("lastName") String lastName,
@FieldMap Map<String, String> fieldMap
);
然后 运行 循环填写详细信息
public void sendRequest(List<Exam> exams) {
Map<String, String> map = new HashMap<>();
for (int i = 0; i < exams.size(); i++) {
map.put("exam[" + i + "].field", exams.get(i).getField());
map.put("exam[" + i + "].score", String.valueOf(exams.get(i).getScore()));
}
yourApiService.Student(firstName, lastName, map); // enqueue or execute whatever
}
这是一种更简单的方法,您还可以使用 Gson 查看自定义 JsonSerializer
。