Как передать строку как тело в методе API Post с помощью модернизации? - PullRequest
1 голос
/ 17 октября 2019

Я разрабатываю приложение для Android, которое отправляет введенные пользователем данные (с помощью текстовых полей редактирования) и вызывает метод POST API для отправки этих данных в тело этого API

Учтите, что URL-адрес API равен "htpps://xxxxx.com/forms/xxxxxx/reponse"

тип контента "Json (Application / json)"

контент выглядит так:

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

Моя проблемаздесь, как я могу передать этот тип тела для модификации, и вместо «XXXXX» в содержании будет строка, которая принимает ввод от пользователя?

Ответы [ 2 ]

0 голосов
/ 17 октября 2019

Я предполагаю, что вы уже знакомы с тем, как реализовать репозитории и интерфейсы для выполнения вызовов 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);
}

Надеюсь, это поможет!.

0 голосов
/ 17 октября 2019

Вы, вероятно, уже используете интерфейс для выполнения вызовов API, и именно здесь вы добавляете тело String к запросу.

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

Если вы не использовали интерфейс с модернизацией, чем вы можетесоздайте экземпляр вышеупомянутого интерфейса, используя существующий RetrofitClient:

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

И теперь вы можете получить доступ к API, вызвав makeCall для экземпляра службы:

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

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

Вы можетепостроить "yourCustomString" с помощью String Builder или около того, хотя я бы не рекомендовал этого, вместо этого я бы использовал ConverterFactory и отобразил бы ваши JSON-данные на Java POJO. Например Моши (com.squareup.retrofit2: конвертер-моши). Если вы сделаете это, вы можете использовать Java POJO в качестве аннотированного атрибута @Body и просто установить два атрибута «questionId» и «answer1» в POJO вместо создания 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 изатем добавьте столько ответов, сколько вы хотите, к атрибуту ответов, а затем используйте объект Body в качестве параметра в интерфейсе модернизации.

Примечание. Если вы это сделаете, вы должны добавить MoshiConverterFactory в RetrofitClient при сборке. это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...