Android Retrofit2 не удается заставить POST-запрос работать

#java #android #retrofit #retrofit2

#java #Android #модернизация #модернизация 2

Вопрос:

Я не могу заставить POST http-запрос работать. Похоже, я неправильно использую библиотеку retrofit2, но, судя по моим исследованиям, то, что у меня есть, должно работать.

Вот как выглядит мой упрощенный объектный класс:

 public class Tournament {
    private String name;
    private int nOfGames;
    private String game;
    private String userId;

    public Tournament(String name, int nOfGames, String game, String userId) {
        this.name = name;
        this.nOfGames = nOfGames;
        this.game = game;
        this.userId = userId;
    }
}
 

Я попробовал два подхода:

подход 1:

модифицированный интерфейс:

 @Headers({"Content-Type: application/json;charset=UTF-8"})
@POST("TournamentApi/")
Single<Tournament> createTournament(@Body Tournament tournament);
 

использование:

 Tournament tournament = new Tournament(
        "some name",
        2,
        "some game",
        "1");

api.createTournament(tournament);
 

подход 2:

модифицированный интерфейс:

 @FormUrlEncoded
@POST("TournamentApi/")
public void insertTournament(
        @Field("Name") String name,
        @Field("NOfGames")  int nOfGames,
        @Field("Game") String game,
        @Field("UserId") String userId,
        Callback<Response> callback);
 

использование:

 api.insertTournament(
        tournamentName.getText().toString(),
        Integer.parseInt(bestOfN.getText().toString()),
        gameName.getText().toString(),
        "1",
        new Callback<Response>() {
            @Override
            public void onResponse(Call<Response> call, Response<Response> response) {
                String output = call.toString();
                String responze = response.toString();
            }

            @Override
            public void onFailure(Call<Response> call, Throwable t) {
                String output = call.toString();
            }
        });
 

Первый подход вообще ничего не делает, никаких ошибок, ничего. Я даже пытался использовать HttpLoggingInterceptor, но ничего не появляется вообще. Похоже, никаких просьб не поступало. Второй подход полностью завершает работу моего приложения, потому что я получаю No Retrofit annotation found. (parameter #1) сообщение об ошибке, но я видел другие сообщения с теми же фрагментами без каких-либо примечаний к обратному вызову, которые предположительно работали.

Я также использую retrofit2 для запросов get, которые работают просто отлично, это просто post-запросы, которые я не могу заставить работать.

Наконец, вот что работает безупречно (вставляет запись в базу данных), если я использую его с Postman:

 POST http://192.168.1.124:5001/api/TournamentApi
{
    "Name": "blabla_tournament",
    "NOfGames": 3,
    "Game": "some_game",
    "UserId": "5"
}
 

Я бы заподозрил, что это как-то связано с localhost, но поскольку запросы get работают так, как и должны быть, я почти уверен, что проблема в том, что я неправильно использую retrofit2.

Комментарии:

1. Каков ответ на ваш POST-запрос API?

Ответ №1:

Попробуйте что-то вроде этого. @Headers({«Content-Type: application / json;charset=UTF-8»}) @POST(«TournamentApi») Одиночный турнир createTournament(турнир @Body Tournament); `

`

Ответ №2:

Вы должны изменить: ‘@Body Tournament tournament’
на: ‘@Body JSONObject tournament’
Это будет работать.