如何使用改进在api post方法中将字符串作为主体传递?

时间:2019-10-17 05:27:27

标签: java android json api retrofit2

我正在开发一个Android应用程序,该应用程序发送用户输入的数据(通过编辑文本框),并调用POST API方法以在该API主体中发送此数据

考虑者的API URL为“ htpps://xxxxx.com/forms/xxxxxx/reponse”

内容类型“ Json(Application / json)”

内容如下:

{"answers":
"[{\"questionId\":\"r8554145065f6486d8a362bec92030a06\",\"answer1\":\"xxxxx\"},
  {\"questionId\":\"rf516c5bf916e4d6d960a1f8abc82f33b\",\"answer1\":\"xxxx\"}]"}

我的问题是在这里,如何将这种类型的主体传递给改型,而不是内容中的“ XXXXX”,而是需要用户输入的字符串?

2 个答案:

答案 0 :(得分:0)

您可能已经在使用接口进行api调用,这就是将String正文添加到请求的地方。

public interface YourService{
  @POST("forms/xxxxxx/reponse")
  Call<Object> makeCall(@Body String body);
}

如果您还没有使用过具有改造功能的接口,则可以使用现有的RetrofitClient创建上述接口的实例:

YourService service = retrofitClient.create(YourService.class);

现在您可以通过在服务实例上调用makeCall来访问api:

service.makeCall(yourCustomString).enqueue(new Callback<Object>() {
    @Override
    public void onResponse(Response<MovieResponse> response) {...}

    @Override
    public void onFailure(Throwable t) {...}
});

即使我不建议这样做,也可以使用String生成器构建“ yourCustomString”,而是使用ConverterFactory并将JSON-Data映射到Java POJO。例如Moshi(com.squareup.retrofit2:converter-moshi)。 如果这样做,可以将Java POJO用作@Body带注释的属性,只需在POJO上仅设置两个属性“ questionId”和“ answer1”,而不用构建String。

如果这样做,最终将得到两个类:

public class Answer {
    @Json(name = "questionId")
    public String questionId;

    @Json(name = "answer1")
    public String answer1;
}

public class Body {
    @Json(name = "answers")
    private List<Answer> answers = new LinkedList<>();
}

现在,您只需创建一个Body对象,然后将所需数量的答案添加到Answers属性中,然后将Body对象用作改造界面上的参数即可。

注意:如果这样做,则必须在构建MoshiConverterFactory时将其添加到RetrofitClient中。

答案 1 :(得分:0)

我假设您已经熟悉如何实现用于进行API调用的存储库和接口。

对于这种情况,您首先需要DTO来回答。

public class AnswerDTO
{
    private String questionId;
    private String answer1;

    public AnswerDTO(String questionId, String answer1)
    {
        this.questionId = questionId;
        this.answer1 = answer1;
    }
}

现在您可以创建API调用接口。

public interface QuestionsService
{
    @FormUrlEncoded
    @POST("requestUrlHere")
    Call<Response> yourApiCall(@Field("answers[]") List<AnswerDTO> answers);
}

希望这会有所帮助!。