从 api 服务器获取 400 请求
Getting 400 request from api server
我正在开发我正在使用 POST 请求的 android 应用程序
我收到 400 错误请求错误
我想也许他们是一个模型 class 错误我不确定请回复
RetrofitInstance
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
型号CLASS
类型 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 + '\'' +
"}";
}
}
Activity
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。
更改接口调用:
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");
您必须使您的值与所需的类型相同
@FormUrlEncoded
@POST("api/movie")
Call<Movie> setMovie(@Field("title") String title,
@Field("genreId") String genreId,
@Field("numberInStock") String numberInStock,
@Field("dailyRentalRate") String dailyRentalRate);
}
我还建议使用带有 @Body
注释的 One pojo class。
顺便说一下,为了更好地理解网络问题,您最好使用 chuck 库,只需在 okhttp 对象中添加 Chuck 作为拦截器即可。它会显示真正的原因,帮助您更快地找到问题
你可以试试下面的方法。
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 END POINT 应该如下所示
@POST("api/movie")
Call<Movie> setMovie(@Body JsonObject jsonObject);
我正在开发我正在使用 POST 请求的 android 应用程序 我收到 400 错误请求错误
我想也许他们是一个模型 class 错误我不确定请回复
RetrofitInstance
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
型号CLASS
类型 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 + '\'' +
"}";
}
}
Activity
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。
更改接口调用:
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");
您必须使您的值与所需的类型相同
@FormUrlEncoded
@POST("api/movie")
Call<Movie> setMovie(@Field("title") String title,
@Field("genreId") String genreId,
@Field("numberInStock") String numberInStock,
@Field("dailyRentalRate") String dailyRentalRate);
}
我还建议使用带有 @Body
注释的 One pojo class。
顺便说一下,为了更好地理解网络问题,您最好使用 chuck 库,只需在 okhttp 对象中添加 Chuck 作为拦截器即可。它会显示真正的原因,帮助您更快地找到问题
你可以试试下面的方法。
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 END POINT 应该如下所示
@POST("api/movie")
Call<Movie> setMovie(@Body JsonObject jsonObject);