android - Retrofit2 post 方法显示服务器内部错误但 postman 给出响应

标签 android post retrofit2

我对翻新很陌生。我正在使用 retrofit2 进行 API 集成。我有一个用于 POST 方法的 API。我从 postman 那里发送正文,我得到了回应,但是当我以编程方式执行此操作时,我收到“内部服务器错误”。

这是我的 postman 回复 enter image description here

我的代码是

 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/

相关文章:

android - 使用Kotlin将多个值传递给Android Studio中的另一个Activity

android - 在 ListView 中查找复选框的位置

javascript - 通知: Undefined index: dateform

android - 如何在状态代码为 400 时使用 Retrofit 和 RxJava 来获取错误消息?

java - "&minus"而不是 TextView 中的 "-",它从 JSON 设置文本

android - 我在android文件中有一个错误

android - 单击 RecyclerView 上的 ViewPager 替换 fragment

android - 改造不会在断点处停止

rest - RESTful 发布多个实体的策略

php - 分别显示每个测验查询