【问题标题】:Retrofit2 post method showing server internal error but postman giving responseRetrofit2 post 方法显示服务器内部错误但邮递员给出响应
【发布时间】:2017-06-15 06:25:08
【问题描述】:

我对改装很陌生。我正在使用 retrofit2 进行 API 集成。我有一个 POST 方法的 API。我正在从邮递员那里发送正文并收到响应,但是当我以编程方式执行此操作时,我收到“内部服务器错误”。

这是我的发帖人回复

我的代码是

 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 的接口,即使出现相同的内部服务器错误。

请帮我解决这个问题。

提前致谢。

【问题讨论】:

    标签: android post retrofit2


    【解决方案1】:

    这是因为 post 方法 Retrofit 2 中的一个小问题,称为内容类型。您只需将内容类型作为标题的表单数据提供,然后访问它。此外,您需要创建一个 POJO 类,并通过新创建的 POJO 类使用 @Body 的注释在改造方法中传递值。

    下面是它的演示:

    在您的界面中,声明这一点(这里您将内容类型指定为表单数据,因为您正在访问的后端正在接受内容类型作为表单数据)

    例如:

    @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;
        }
    
    }
    

    最后,在您的活动中使用这些,如下所示:

    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 类。

    【讨论】:

      【解决方案2】:

      如果不实际调试url,这有点难以判断。但是通常的原因可能如下,我遇到过。 1) base url 和 post 方法中的 url 必须正确区分。

      2) 如果这些参数是 url 的参数,则尝试将它们作为主体发送,例如

       public Call <String> getLoginCred(@Body HashMap<String,Object> userM);
      

      如果参数是 url 的参数,那么只需使用 @url 进行 url 字符串调用。

      检查 BuildConfig.POSTSTATUS 字符串是否正确,即您的基本 url 应该类似于 https:/192.168.1.1/ 并且 Poststatus 字符串类似于“/api/User/AuthanticateUserById”,因此 / 不会丢失以及其他一些url 没有混进去。

      【讨论】:

      • 是的 url 是正确的。如果我使用@Multipart,它会给出错误的请求错误,而对于表单 url,它会给出内部服务器错误。
      • 您是否尝试以@Body 形式发送参数?
      • 是的请求正文...如果我这样做,我会收到错误的请求错误
      • 有一点可以确定,如果存在内部服务器错误,则意味着没有命中正确的 url,或者错误的请求可能意味着您发送的参数之一错误或丢失。
      • 但是我在邮递员中使用的相同 url,我得到了响应。我没有得到我做错的地方
      【解决方案3】:
      use get method
       @FormUrlEncoded
          @GET(BuildConfig.POSTSTATUS)
      

      url=t/api/mobile/user/pos url 使用 GET

      【讨论】:

        猜你喜欢
        • 2017-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-01
        • 2019-06-22
        • 1970-01-01
        • 2020-07-27
        • 2017-05-05
        相关资源
        最近更新 更多