Получение 400 запроса с сервера API

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

Я думаю, может быть, это ошибка класса модели, я не уверен, пожалуйста, ответьте

Экземпляр модификации

public class RetrofitInstance {
private static Retrofit retrofit = null;
private static String BASE_URL = "http://<your ip address>:3000/";

public static Retrofit getService(){

    Gson gson = new GsonBuilder()
            .setLenient()
            .create();

    if(retrofit == null){
        retrofit = new Retrofit
                .Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create(gson))
                .build();

    }
    return retrofit;
}
}    

КОНЕЧНАЯ ТОЧКА API

public interface EndPoints {

    @FormUrlEncoded
    @POST("api/movie")
    Call<Movie> setMovie(@Field("title") String title,
                 @Field("genreId") String genreId,
                 @Field("numberInStock") int numberInStock,
                 @Field("dailyRentalRate") int dailyRentalRate);

    }

ЗАПРОС POSTMAN И ОТВЕТ НА ПРОВЕРКУ РАБОТЫ API https://ibb.co/TkvDZFz

МОДЕЛЬ КЛАСС

Жанр Pojo:

public class Genre{

    @SerializedName("name")
    private String name;

    @SerializedName("_id")
    private String id;

    public void setName(String name){
        this.name = name;
    }

    public String getName(){
        return name;
    }

    public void setId(String id){
        this.id = id;
    }

    public String getId(){
        return id;
    }

    @Override
    public String toString(){
        return 
            "Genre{" + 
            "name = '" + name + '\'' + 
            ",_id = '" + id + '\'' + 
            "}";
        }
}

Фильм POJO:

public class Movie{

    @SerializedName("dailyRentalRate")
    private int dailyRentalRate;

    @SerializedName("__v")
    private int V;

    @SerializedName("genre")
    private Genre genre;

    @SerializedName("_id")
    private String id;

    @SerializedName("title")
    private String title;

    @SerializedName("numberInStock")
    private int numberInStock;

    @SerializedName("genreId")
    private String genreId;

    public Movie(String title, String genreId, int numberInStock ,int dailyRentalRate) {
        this.dailyRentalRate = dailyRentalRate;
        this.title = title;
        this.numberInStock = numberInStock;
        this.genreId = genreId;
    }

    public void setDailyRentalRate(int dailyRentalRate){
        this.dailyRentalRate = dailyRentalRate;
    }

    public int getDailyRentalRate(){
        return dailyRentalRate;
    }

    public void setV(int V){
        this.V = V;
    }

    public int getV(){
        return V;
    }

    public void setGenre(Genre genre){
        this.genre = genre;
    }

    public Genre getGenre(){
        return genre;
    }

    public void setId(String id){
        this.id = id;
    }

    public String getId(){
        return id;
    }

    public void setTitle(String title){
        this.title = title;
    }

    public String getTitle(){
        return title;
    }

    public void setNumberInStock(int numberInStock){
        this.numberInStock = numberInStock;
    }

    public int getNumberInStock(){
        return numberInStock;
    }

    @Override
    public String toString(){
        return 
            "Movie{" + 
            "dailyRentalRate = '" + dailyRentalRate + '\'' + 
            ",__v = '" + V + '\'' + 
            ",genre = '" + genre + '\'' + 
            ",_id = '" + id + '\'' + 
            ",title = '" + title + '\'' + 
            ",numberInStock = '" + numberInStock + '\'' + 
            "}";
        }
}

Мероприятия

public class MainActivity extends AppCompatActivity {

private Button click;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    click = findViewById(R.id.click);

    click.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            addMovieCall();
        }
    });
}

private void addMovieCall() {
    final EndPoints vidlyEndPoint = RetrofitInstance.getService().create(EndPoints.class);
    Call<Movie> call =  vidlyEndPoint.setMovie("intelRPG","5d7398d2bdc4d04960d60845",20,30);

    call.enqueue(new Callback<Movie>() {
        @Override
        public void onResponse(Call<Movie> call, Response<Movie> response) {
            if(!response.isSuccessful()){
                Log.e("Response", String.valueOf(response.code()));
                Log.e("Response", String.valueOf(response.message()));
            }
            else if(response.isSuccessful()){
                Log.e("Response", String.valueOf(response.body().getId()));
                Log.e("Response", String.valueOf(response.body().getTitle()));
                Log.e("Response", String.valueOf(response.body().getGenre().getName()));
                Log.e("Response", String.valueOf(response.body().getDailyRentalRate()));
                Log.e("Response", String.valueOf(response.body().getNumberInStock()));
                Toast.makeText(getApplicationContext(),"Posted Successfully",Toast.LENGTH_SHORT).show();
            }
        }

        @Override
        public void onFailure(Call<Movie> call, Throwable t) {
            Log.e("Response failed",t.getMessage());
        }
    });
}
 }

Я ожидаю, что на выходе будет 200, но фактический результат равен 400.


person Ahsan Abdullah    schedule 09.09.2019    source источник
comment
Вы уверены, что базовый URL-адрес и введенный вами путь верны?   -  person Kushan    schedule 09.09.2019
comment
я хочу сказать, проверьте, действительно ли запрос попадает в ваш API   -  person Kushan    schedule 09.09.2019
comment
я думаю, что мой запрос не попадает в API, мой базовый URL-адрес правильный   -  person Ahsan Abdullah    schedule 09.09.2019
comment
опубликуйте базовый URL-адрес, который вы установили, а также опубликуйте фактический полный URL-адрес, который вы используете в почтальоне   -  person Kushan    schedule 09.09.2019
comment
я отправил выбор почтальона, вы можете проверить там ответ   -  person Ahsan Abdullah    schedule 09.09.2019
comment
не могу увидеть URL-адрес запроса в этом, также я думаю, что, скорее всего, проблема в базовом URL-адресе, который вы установили при создании модифицированного экземпляра, поэтому, пожалуйста, опубликуйте URL-адрес, который вы установили   -  person Kushan    schedule 09.09.2019
comment
хорошо, я публикую   -  person Ahsan Abdullah    schedule 09.09.2019
comment
все остальные запросы работают как запросы GET, которые я тестировал в другом приложении с этим IP-адресом.   -  person Ahsan Abdullah    schedule 09.09.2019
comment
Ваш сервер и мобильное устройство находятся в одной сети?   -  person Faysal Ahmed    schedule 09.09.2019
comment
да они в одной сети   -  person Ahsan Abdullah    schedule 09.09.2019


Ответы (3)


Вы можете попробовать, как показано ниже.

JsonObject requestBody = new JsonObject();
            requestBody.addProperty("title", "intelRPG");
            requestBody.addProperty("genreId", "5d7398d2bdc4d04960d60845");
            requestBody.addProperty("numberInStock", "20");
            requestBody.addProperty("dailyRentalRate", "30");

Call<Movie> call =  vidlyEndPoint.setMovie(requestBody);
.....

КОНЕЧНАЯ ТОЧКА API должна быть такой, как показано ниже.

@POST("api/movie")
Call<Movie> setMovie(@Body JsonObject jsonObject);

Надеюсь, это поможет вам, Удачного кодирования

person Jakir Hossain    schedule 09.09.2019

Вы должны сделать свои значения того же типа, что и требуемый

@FormUrlEncoded
@POST("api/movie")
Call<Movie> setMovie(@Field("title") String title,
             @Field("genreId") String genreId,
             @Field("numberInStock") String numberInStock, 
             @Field("dailyRentalRate") String dailyRentalRate);

}

Я бы также предложил использовать класс One pojo с аннотацией @Body.

Кстати, чтобы лучше понять проблему с сетью, лучше использовать библиотеку chuck, просто добавив Chuck в качестве перехватчика в объект okhttp. Это покажет реальную причину, поможет вам быстрее найти проблему

https://github.com/jgilfelt/chuck

person Azamat Mahkamov    schedule 09.09.2019

Измените вызов интерфейса:

Call<Movie> setMovie(@Field("title") String title,
                     @Field("genreId") String genreId,
                     @Field("numberInStock") String numberInStock, // Needs String
                     @Field("dailyRentalRate") String dailyRentalRate);

    }

и вызов будет:

Call<Movie> call =  vidlyEndPoint.setMovie("intelRPG","5d7398d2bdc4d04960d60845","20","30");
person Ashish    schedule 09.09.2019
comment
он все еще дает мне 400 неверных запросов - person Ahsan Abdullah; 09.09.2019
comment
@AhsanAbdullah, вы пробовали с обновленным ответом, сэр, потому что я внес два изменения после вашего первого комментария. - person Ashish; 09.09.2019
comment
да, я применил 2 изменения в своем коде, но все еще получаю ошибку 400, я изменил номер на складе на строку - person Ahsan Abdullah; 09.09.2019
comment
Применяя строку, он по-прежнему дает 400 неверных запросов. - person Ahsan Abdullah; 09.09.2019