Я перехожу с HttpURLConnection на Retrofit 2 и отправка данных через POS не работает - PullRequest
0 голосов
/ 28 августа 2018

Я отправляю данные на сервер, используя HttpURLConnection, и он работает правильно.

JSON, который я отправляю, выглядит следующим образом:

{
"name":"Product X",
  	"desc":"abcdef",
   	"barCode":"",
   	"quantity":123,
   	"esExtra":false,
   	"idUnit":3,
   	"idDept":13,
   	"idCat":60,
   	"idSubcat":0,
   	"costP":1.96,
   	"costS":2.69,
   	"idEmp":3,
   	"image":"\/9j\/4AAQSkZJRgABAQAAAQABAAD\/Z\n",
   	"taxes":[
  	  {
     "id":1
  }
 ]
}

Для модернизации класс, связанный с JSON, выглядит следующим образом:

public class ActionRegisterProductService {
    @SerializedName("name")
    public String name;
    @SerializedName("desc")
    public String desc;
    @SerializedName("barCode")
    public String barCode;
    @SerializedName("quantity")
    public Integer quantity;
    @SerializedName("esExtra")
    public Boolean esExtra;
    @SerializedName("idUnit")
    public Integer idUnit;
    @SerializedName("idDept")
    public Integer idDept;
    @SerializedName("idCat")
    public Integer idCat;
    @SerializedName("idSubcat")
    public Integer idSubcat;
    @SerializedName("costP")
    public Double costP;
    @SerializedName("costS")
    public Double costS;
    @SerializedName("idEmp")
    public Integer idEmp;
    @SerializedName("image")
    public String image;
    @SerializedName("taxes")
    public List<Taxes> listTaxes = null;

    public ActionRegisterProductService(
            String name,
            String desc,
            String barCode,
            int quantity,
            boolean esExtra,
            int idUnit,
            int idDept,
            int idCat,
            int idSubcat,
            double costP,
            double costS,
            int idEmp,
            String image,
            List<Taxes> listTaxes,
    ){
            this.name = name;
            this.desc = desc;
            this.barCode = barCode;
            this.quantity = quantity;
            this.esExtra = esExtra;
            this.idUnit = idUnit;
            this.idDept = idDept;
            this.idCat = idCat;
            this.idSubcat = idSubcat;
            this.costP = costP;
            this.costS = costS;
            this.idEmp = idEmp;
            this.image = image;
            this.listTaxes = listTaxes;
            }
    }


}

Для отправки данных я делаю следующее:

 apiInterface = APIClient.getClient().create(APIInterface.class);
                        ActionRegisterProductService  actionRegisterProductService  = 
new ActionRegisterProductService (
 "Product X",
 "abcd",
 "",
 123,
 false,
 5,
 1,
 3,
 0,
 1.23,
 4.25,
 3,
 "/9j\/4AAQSkZJRgABAQAAAQABAAD\/Z\n",
 mylistTaxes,
 );

затем выполняется следующее:

Call<ActionRegisterProductService> call = apiInterface.createProduct(actionRegisterProductService);
                        call.enqueue(new Callback<ActionRegisterProductService>() {
@Override
   public void onResponse(Call<ActionRegisterProductService> call, Response<ActionRegisterProductService> response) {
    ActionRegisterProductService user1 = response.body();
     if (response.raw().code() == 200 && response.raw().message().toLowerCase().equals("ok")) {

   }
}

 @Override
public void onFailure(Call<ActionRegisterProductService> call, Throwable t) {
                                                             
 call.cancel();
                           }

});

При выполнении строк над сервером сервер отвечает правильно, т.е. response.raw () .Code равен 200, а response.raw.Message равен OK.

Но при выполнении другого метода (из старого способа) для получения созданных продуктов, продукт, созданный с помощью Retrofit, не появляется. Если это делается с помощью метода HttpURLConnection, он работает правильно, именно по этой причине я подозреваю, что JSON создается неправильно.

apiInterface.createProduct выглядит следующим образом:

public interface APIInterface {
    @POST("Product")
    Call<ActionRegisterProductService> createProduct(@Body ActionRegisterProductService actionRegisterProductService);
}

Есть предложения или комментарии?

UPDATE

Кажется, что я не выполняю фундаментальное условие, которое указывает, что должен быть класс для отправки данных, такой как класс для приема (он не обязательно должен быть таким же)

Call<MyResponseClass> sendDataToServer(@Body MyRequestClass myModal);

Основные условия

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Проблема была решена при создании класса для приема данных. Как только я это сделал, с сервера пришел ответ, указывающий на синтаксическую ошибку при отправке данных. Я исправил эту проблему, и она работала правильно.

0 голосов
/ 29 августа 2018

В вашем APIClient добавьте фабрику конвертеров gson следующим образом Retrofit.Builder().addConverterFactory(GsonConverterFactory.create())

если вы не нашли GsonConverterFactory, добавьте эту зависимость
implementation "com.squareup.retrofit2:converter-gson:2.4.0"

...