2

这是我的邮递员要求:

在此处输入图像描述

我将使用 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 + '\'' + 
        "}";
    }
}

邮递员正确发送请求并收到响应代码 204,但我的改造请求无法正确发送请求。如何使用 Retrofit 版本 2 和 RxJava 版本 2 在 x-www-form-urlencoded 请求中发送对象列表?

4

2 回答 2

1

如果 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
}

这更像是一种更简单的方法,您也可以JsonSerializer使用 Gson 研究自定义 a。

于 2021-05-22T17:32:16.937 回答
1

也许你可以试试这个:

@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");
于 2021-05-11T08:16:07.770 回答