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

How to pass string as a body in api post method using retrofit?

我正在开发一个 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" 在内容中会有一个字符串接受用户的输入?

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

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 builder 等构建 "yourCustomString",尽管我不推荐这样做,但我会使用 ConverterFactory 并将您的 JSON-Data 映射到 Java POJO。例如 Moshi (com.squareup.retrofit2:converter-moshi)。 如果这样做,您可以使用 Java POJO 作为 @Body 注释属性,您只需在 POJO 上设置两个属性 "questionId" 和 "answer1" 而不是构建字符串。

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

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。

我假设您已经熟悉如何实现存储库和接口以进行 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);
}

希望对您有所帮助!