【问题标题】:passing custom object in retrofit2在改造2中传递自定义对象
【发布时间】:2016-04-11 08:56:24
【问题描述】:

我试图通过retrofit2 传递一个自定义对象,我的问题是服务器是否自动将我的自定义对象写入json 或者我是否必须为此编写一个php 文件。与此同时,我成功发布到服务器但无法写入 json。

我的目标是将自定义对象写入服务器,并将自定义对象的内容写入json文件。

这是我的改造 Api

public interface ApsaraCatalogAPI {

    @GET("/apsaratrendz/data/apsara_json_document_v2.json")
    Call<List<ApsaraCatalogModel>> getFeed();

    @POST("/apsaratrendz/data/apsara_json_orders_document.json")
    Call<Void> setOrder(@Body OrderModel orderModel);
}

这是我的调用 api 函数

@Override
    public void onClick(View v) {
        int total = 0;
        if(v.getId()==R.id.fabButtonCart && cartlist.size()!=0)
        {
            // get details from shared preferences
            OrderModel orderModel = new OrderModel();
            orderModel.setDate(getDate());
            orderModel.setName("ssdfs");
            orderModel.setEmail("sdf@gmail.com");
            orderModel.setNoofitems(String.valueOf(cartlist.size()));
            orderModel.setOrderno("32335");
            orderModel.setPhone("9896566444");
            for(int i=0; i<cartlist.size();i++){
                Productdetail pd = new Productdetail();
                pd.getSellingprice(String.valueOf(cartlist.get(i).getSellingPrice()));
                pd.getPid(cartlist.get(i).getEANCode());
                total += cartlist.get(i).getSellingPrice();
                orderModel.getProductdetails().add(pd);
            }
            //
            // now go for insertion using retrofit
            requestData(orderModel);
            Toast.makeText(getApplicationContext(), "Total Price : Rs."+total+"/-", Toast.LENGTH_LONG).show();
        }else{
            Toast.makeText(getApplicationContext(), "Cart is Empty", Toast.LENGTH_LONG).show();
        }

    }

这是我对改造 api 的服务请求,我正在传递新创建的 POJO OrderModel 类。

private void requestData(OrderModel orderModel) {

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(ENDPOINT)
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        ApsaraCatalogAPI service = retrofit.create(ApsaraCatalogAPI.class);
        Call<Void> call = service.setOrder(orderModel);

        call.enqueue(new Callback<Void>() {
        @Override
        public void onResponse(Call<Void> call, Response<Void> response) {
            if(response.isSuccessful()){
                Log.d("InApi","Yipppie");
            }
        }

        @Override
        public void onFailure(Call<Void> call, Throwable t) {
            Log.d("InApi","Kaboom");
        }
    });

    }

我的 POJO 类如下:

import java.util.Map;
        import java.util.ArrayList;
        import java.util.HashMap;
        import java.util.List;
public class OrderModel {

    private String name;
    private String email;
    private String phone;
    private String orderno;
    private String date;
    private String noofitems;
    private List<Productdetail> productdetails = new ArrayList<Productdetail>();
    private Map<String, Object> additionalProperties = new HashMap<String, Object>();

    /**
     *
     * @return
     * The name
     */
    public String getName() {
        return name;
    }

    /**
     *
     * @param name
     * The name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     *
     * @return
     * The email
     */
    public String getEmail() {
        return email;
    }

    /**
     *
     * @param email
     * The email
     */
    public void setEmail(String email) {
        this.email = email;
    }

    /**
     *
     * @return
     * The phone
     */
    public String getPhone() {
        return phone;
    }

    /**
     *
     * @param phone
     * The phone
     */
    public void setPhone(String phone) {
        this.phone = phone;
    }

    /**
     *
     * @return
     * The orderno
     */
    public String getOrderno() {
        return orderno;
    }

    /**
     *
     * @param orderno
     * The orderno
     */
    public void setOrderno(String orderno) {
        this.orderno = orderno;
    }

    /**
     *
     * @return
     * The date
     */
    public String getDate() {
        return date;
    }

    /**
     *
     * @param date
     * The date
     */
    public void setDate(String date) {
        this.date = date;
    }

    /**
     *
     * @return
     * The noofitems
     */
    public String getNoofitems() {
        return noofitems;
    }

    /**
     *
     * @param noofitems
     * The noofitems
     */
    public void setNoofitems(String noofitems) {
        this.noofitems = noofitems;
    }

    /**
     *
     * @return
     * The productdetails
     */
    public List<Productdetail> getProductdetails() {
        return productdetails;
    }

    /**
     *
     * @param productdetails
     * The productdetails
     */
    public void setProductdetails(List<Productdetail> productdetails) {
        this.productdetails = productdetails;
    }

    public Map<String, Object> getAdditionalProperties() {
        return this.additionalProperties;
    }

    public void setAdditionalProperty(String name, Object value) {
        this.additionalProperties.put(name, value);
    }

}

产品详情类:

import java.util.HashMap;
import java.util.Map;

public class Productdetail {

    private String pid;
    private String sellingprice;
    private Map<String, Object> additionalProperties = new HashMap<String, Object>();

    /**
     *
     * @return
     * The pid
     * @param s
     */
    public String getPid(String s) {
        return pid;
    }

    /**
     *
     * @param pid
     * The pid
     */
    public void setPid(String pid) {
        this.pid = pid;
    }

    /**
     *
     * @return
     * The sellingprice
     * @param s
     */
    public String getSellingprice(String s) {
        return sellingprice;
    }

    /**
     *
     * @param sellingprice
     * The sellingprice
     */
    public void setSellingprice(String sellingprice) {
        this.sellingprice = sellingprice;
    }

    public Map<String, Object> getAdditionalProperties() {
        return this.additionalProperties;
    }

    public void setAdditionalProperty(String name, Object value) {
        this.additionalProperties.put(name, value);
    }

}

【问题讨论】:

  • 服务器的 JSON 响应是什么?根据错误消息,您的 API 返回一个对象列表,但您指定了一个对象。
  • 我不希望我的 api 返回任何东西(更新的问题),只想将我的 pojo 写入 json,所以我需要 php 文件来做到这一点还是服务器处理这个,?。我对改造和 php 很陌生..
  • 现在从改造方面看起来一切都很好。

标签: java php android gson retrofit2


【解决方案1】:

Retrofit 根据您的 POJO 生成 json 并将其设置在 post 有效负载上。 所以,在这种情况下:

@POST("/apsaratrendz/data/apsara_json_orders_document.json")
Call<Void> setOrder(@Body OrderModel orderModel);

帖子的正文将是 orderModel 的 json 表示。

如果需要更改json中生成的属性名称可以使用SerializedName Annotation,非常有用:

public class OrderModel {
    @SerializedName("other_name_for_json") 
    private String name;

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 2021-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多