2017-01-30 1 views
2

Я очень новенький в ретрофт. Я использую retrofit2 для интеграции с API. У меня есть API для метода POST. Я отправляю тело от почтальона, и я получаю ответ, но когда я делаю это программно, я получаю «Внутреннюю ошибку сервера».Retrofit2 метод сообщения, показывающий внутреннюю ошибку сервера, но почтальон, дающий ответ

Это мой пост ответ человек 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, даже при том же внутреннем сервере.

Пожалуйста, помогите мне в этом.

Заранее спасибо.

ответ

4

Это из-за небольшой проблемы в пост метода Модернизированный 2 под названием типа содержимого. Вам просто нужно указать тип содержимого как данные формы для заголовка, а затем получить доступ к нему. Кроме того, вам нужно сделать один класс POJO и передать значения в вашем модифицированном методе через этот новый класс POJO, используя аннотацию как @Body.

Вот демонстрация этого:

В интерфейсе, объявляю (Здесь вы даете тип содержимого в качестве форм-данных, так как бэкенд вы обращаетесь, принимает тип содержимого в качестве форм-данных)

Ex:

@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, чтобы получить ответы.

+1

его нехороший adhish u обманывает stackoverflow –

1

Сложно сказать, не отлаживая исходный код. Но обычные причины могут быть следующими, с которыми я столкнулся. 1) Базовый url и url в методе post должны быть дифференцированы должным образом.

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 не смешивается с ним.

+0

Да, правильный URL. И если я использую @Multipart, это даёт ошибку с плохим запросом, а для формы url - его внутреннюю ошибку сервера. – Yamuna

+0

Пробовал ли вы отправлять параметры в форме @Body? – Pritish

+0

Да, тело запроса ... Если я делаю так, я получаю ошибку с неправильным запросом – Yamuna

0
use get method 
@FormUrlEncoded 
    @GET(BuildConfig.POSTSTATUS) 

URL = т /api/mobile/user/pos URL использует GET

Смежные вопросы