Модернизация POST-запроса с параметрами тела Android - PullRequest
0 голосов
/ 22 мая 2019

Мне нужно выполнить запрос с модификацией, но у меня есть проблема, которую я не очень хорошо понимаю. Прежде чем пытаться с кодом, я проверил вызов API с Почтальоном и запрос выглядит так:

capture1 enter image description here

Вот мой код Android:

public class API {

private static <T> T builder(Class<T> endpoint) {

    return new Retrofit.Builder()
            .baseUrl(Utils.API_BASE_URL)
            .addConverterFactory(ScalarsConverterFactory.create())
            .addConverterFactory(GsonConverterFactory.create())
            .build()
            .create(endpoint);
}
public static AllRequests request() {
    return builder(AllRequests.class);
}
}

РЕДАКТИРОВАТЬ запрос:

@POST("api/android-feedback")
@Headers({"Content-Type: application/x-www-form-urlencoded", "Authorization: F#@3FA@#Rad!@%!2s"})
Call<String> sendFeedback(@Body FeedbackBody body);

FeedbackBody:

public class FeedbackBody{
private final String email;
private final String feedback;

public FeedbackBody(String email, String feedback){
    this.email = email;
    this.feedback = feedback;
}

}

И, наконец, я создаю запрос и жду ответа, проблема в том, что я получаю сообщение в методе onFail

   private void sendFeedbackRequest(){
    API.request().sendFeedback(new FeedbackBody("testmeil@meil.com", "test feedback").enqueue(new Callback<String>() {
        @Override
        public void onResponse(Call<String> call, Response<String> response) {
            goToMainActivity();
        }

        @Override
        public void onFailure(Call<String> call, Throwable t) {
            Toast.makeText(SplashScreenActivity.this, R.string.try_again_later, Toast.LENGTH_SHORT).show();
        }
    });

EDIT: Все еще не работает .. Я думаю, что я выяснил, где может быть проблема, потому что на стороне сервера ждут простой запрос POST без форматирования Json, я думаю, что Retrofit использует форматирование JSON по умолчанию, и если я отправляю запрос POST и форматирую параметры тела с помощью JSON сервер не сможет проанализировать мой запрос, есть ли возможность отправить простой запрос POST, как на POSTMAN, без форматирования с помощью JSON?

  • Php api Ждет запроса на отправку следующим образом:

$ _ POST ['feedback'] = 'blabla'; $ _POST ['email'] = 'blabla ..';

и, если он получает запрос в формате Json, не может его проанализировать, из-за этого я получаю ответ об ошибке.

Ответы [ 3 ]

0 голосов
/ 22 мая 2019

Сначала необходимо создать запрос (класс POJO)

public class FeedbackRequest {
   public String email;
   public String feedback;
}

когда вы звоните sendFeedbackRequest() передать FeedbackRequest как показано ниже "

FeedbackRequest req = new FeedbackRequest();
req.email= "email";
req.feedback= "feedback"
sendFeedbackRequest(req)

после этого ваш sendFeedbackRequest() должен быть таким

  private void sendFeedbackRequest(FeedbackRequest request){
      API.request().sendFeedback(request).enqueue(new Callback<String>() {
      @Override
      public void onResponse(Call<String> call, Response<String> response) {
        goToMainActivity();
      }

      @Override
      public void onFailure(Call<String> call, Throwable t) {
        Toast.makeText(SplashScreenActivity.this, R.string.try_again_later, Toast.LENGTH_SHORT).show();
    }
});

И ваш запрос на модификацию должен быть таким,

@FormUrlEncoded
@POST("api/android-feedback")
@Headers({"Content-Type: application/json", "Authorization: F31daaw313415"})
Call<String> sendFeedback(@Body FeedbackRequest request);

Теперь это должно работать. не стесняйтесь спрашивать что-нибудь.

0 голосов
/ 22 мая 2019

Java:

@POST("/api/android-feedback")
Call<String> sendFeedback(@Body FeedbackBody feedback);

Kotlin:

@POST("/api/android-feedback")
fun sendFeedback(@Body feedback: FeedbackBody): Call<String>

Также, возможно, вы забыли начальную косую черту в конечной точке.

0 голосов
/ 22 мая 2019

Вы используете фабрику преобразователей Gson.Возможно, будет проще создать один объект, представляющий ваше тело, и использовать его вместо всех отдельных параметров.Таким образом, вы сможете легко следовать инструкциям на веб-сайте Retrofit. введите описание ссылки здесь Существует также множество сайтов, которые позволяют создавать для вас простые старые объекты Java, например этот :

Например, ваш вызов API:

@POST("api/android-feedback")
Call<String> sendFeedback(@Body FeedbackBody feedback);    

И ваш класс FeedbackBody:

public class FeedbackBody{
    private final String email;
    private final String feedback;

    public FeedbackBody(String email, String feedback){
        this.email = email;
        this.feedback = feedback;
    }
}
...