我正在开发一个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”,而是需要用户输入的字符串?
答案 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);
}
希望这会有所帮助!。