我对翻新很陌生。我正在使用 retrofit2 进行 API 集成。我有一个用于 POST 方法的 API。我从 postman 那里发送正文,我得到了回应,但是当我以编程方式执行此操作时,我收到“内部服务器错误”。
我的代码是
private void savePost(String post_body, String permission, String latitude, String longitude, String location) {
try {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BuildConfig.BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
ApiService api = retrofit.create(ApiService.class);
/**
* Calling JSON
*/
Log.d("TOKEN","JWT "+sharedPrefs.getPref(sharedPrefs.token));
Call<PostModel> call = api.postData("JWT "+sharedPrefs.getPref(sharedPrefs.token), post_body, permission, latitude, longitude, location);
/* "JWT "+sharedPrefs.getPref(sharedPrefs.token)
*/
/**
* Enqueue Callback will be call when get response...
*/
call.enqueue(new Callback<PostModel>() {
@Override
public void onResponse(Call<PostModel> call, Response<PostModel> response) {
Log.d(" write post CODE", response.raw() + "");
if (response.isSuccessful()) {
Log.e("post sucess..", "post sucess..");
Toast.makeText(ActivityWritePost.this,"Successfully Posted",Toast.LENGTH_SHORT).show();
} else {
}
}
@Override
public void onFailure(Call<PostModel> call, Throwable t) {
//Dismiss Dialog
Log.d("POST_API", t.getCause() + "");
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
我的模型类是
public class PostModel {
@SerializedName("status")
@Expose
private Integer status;
@SerializedName("message")
@Expose
private String message;
@SerializedName("data")
@Expose
private Data data;
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Data getData() {
return data;
}
public void setData(Data data) {
this.data = data;
}
public class Data {
@SerializedName("id")
@Expose
private Integer id;
@SerializedName("user")
@Expose
private Integer user;
@SerializedName("post_image")
@Expose
private Object postImage;
@SerializedName("post_body")
@Expose
private String postBody;
@SerializedName("permission")
@Expose
private String permission;
@SerializedName("location")
@Expose
private String location;
@SerializedName("latitude")
@Expose
private Integer latitude;
@SerializedName("longitude")
@Expose
private Integer longitude;
@SerializedName("created")
@Expose
private String created;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getUser() {
return user;
}
public void setUser(Integer user) {
this.user = user;
}
public Object getPostImage() {
return postImage;
}
public void setPostImage(Object postImage) {
this.postImage = postImage;
}
public String getPostBody() {
return postBody;
}
public void setPostBody(String postBody) {
this.postBody = postBody;
}
public String getPermission() {
return permission;
}
public void setPermission(String permission) {
this.permission = permission;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
public Integer getLatitude() {
return latitude;
}
public void setLatitude(Integer latitude) {
this.latitude = latitude;
}
public Integer getLongitude() {
return longitude;
}
public void setLongitude(Integer longitude) {
this.longitude = longitude;
}
public String getCreated() {
return created;
}
public void setCreated(String created) {
this.created = created;
}
}
}
这是我的界面
@FormUrlEncoded
@POST(BuildConfig.POSTSTATUS)
Call<PostModel> postData(@Header("Authorization") String Authorization, @Field("post_body") String post_body, @Field("permission") String permission, @Field("latitude") String latitude, @Field("longitude") String longitude, @Field("location") String location);
我也尝试了与 Multipart 的接口(interface),尽管同样的内部服务器错误。
请帮我解决这个问题。
提前致谢。
最佳答案
这是因为 post 方法 Retrofit 2 中一个叫做 content-type 的小问题。您只需要将内容类型作为标题的表单数据,然后访问它。此外,您需要制作一个 POJO 类,并使用注释作为 @Body 通过新制作的 POJO 类在改造方法中传递值。
下面是它的演示:
在你的界面中,声明这个(这里你将内容类型作为表单数据,因为你正在访问的后端正在接受内容类型作为表单数据)
例如:
@Headers("Content-Type: form-data")
@POST(BuildConfig.POSTSTATUS)
Call<ApiModel> postData(@Header("Authorization") String Authorization, @Body WriteAPostModel writeAPostModel);
现在这里是 WriteAPostModel 类,它是您的 POJO 类:
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
/**
* Created by Adhish on 02/02/17.
*/
public class WriteAPostModel {
@SerializedName("post_body")
@Expose
private String post_body;
@SerializedName("permission")
@Expose
private String permission;
@SerializedName("latitude")
@Expose
private String latitude;
@SerializedName("longitude")
@Expose
private String longitude;
@SerializedName("location")
@Expose
private String location;
public String getPost_image() {
return post_image;
}
public void setPost_image(String post_image) {
this.post_image = post_image;
}
@SerializedName("post_image")
@Expose
private String post_image;
public String getPost_body() {
return post_body;
}
public void setPost_body(String post_body) {
this.post_body = post_body;
}
public String getLatitude() {
return latitude;
}
public void setLatitude(String latitude) {
this.latitude = latitude;
}
public String getLongitude() {
return longitude;
}
public void setLongitude(String longitude) {
this.longitude = longitude;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
public String getPermission() {
return permission;
}
public void setPermission(String permission) {
this.permission = permission;
}
}
最后,在您的 Activity 中使用这些,如下所示:
private void savePost(String post_body,String post_image, String permission, String latitude, String longitude, String location) {
try {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BuildConfig.BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
ApiService api = retrofit.create(ApiService.class);
WriteAPostModel writeAPostModel = new WriteAPostModel();
writeAPostModel.setPost_body(post_body);
writeAPostModel.setPermission(permission);
writeAPostModel.setLatitude(latitude);
writeAPostModel.setLongitude(longitude);
writeAPostModel.setLocation(location);
writeAPostModel.setPost_image(post_image);
Call<ApiModel> call = api.postData("JWT "+sharedPrefs.getPref(sharedPrefs.token), writeAPostModel);
/**
* Enqueue Callback will be call when get response...
*/
call.enqueue(new Callback<ApiModel>() {
@Override
public void onResponse(Call<ApiModel> call, Response<ApiModel> response) {
Log.d(" write post CODE", response.raw() + "");
if (response.isSuccessful()) {
Toast.makeText(ActivityWritePost.this,"Successfully Posted",Toast.LENGTH_SHORT).show();
finish();
} else {
}
}
@Override
public void onFailure(Call<ApiModel> call, Throwable t) {
//Dismiss Dialog
Log.d("POST_API", t.getCause() + "");
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
ApiModel 是您获取响应的 POJO 类。
关于android - Retrofit2 post 方法显示服务器内部错误但 postman 给出响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41930098/