安卓改造 |发布自定义对象(将 json 发送到服务器)

Posted

技术标签:

【中文标题】安卓改造 |发布自定义对象(将 json 发送到服务器)【英文标题】:Android Retrofit | Post custom object (send json to server) 【发布时间】:2014-07-25 19:28:41 【问题描述】:

我想知道如何使用改造将自定义对象发送到我的 API,如下所示:

@POST(URL_ORDERS)
public void newOrder(Order order, Callback<Boolean> success);

这是我在服务器上解析它的方式

public function store()
    
    if(Auth::check())
        $order = Input::get();
        $table = $order->table;
        $items = $order->items;

        if(!$table->taken)
            $table->taken = true;

            $order->push();
            $table->push();

            return true;
        
    

    return false;

由于某种原因,我得到了

06-04 20:45:59.275    6085-6306/com.tesis.restapp.restapp W/dalvikvm﹕ threadid=11: thread exiting with uncaught exception (group=0x40aae210)
06-04 20:45:59.285    6085-6306/com.tesis.restapp.restapp E/androidRuntime﹕ FATAL EXCEPTION: Retrofit-Idle
    java.lang.IllegalArgumentException: RestAppApiInterface.newOrder: No Retrofit annotation found. (parameter #1)
            at retrofit.RestMethodInfo.methodError(RestMethodInfo.java:120)
            at retrofit.RestMethodInfo.parameterError(RestMethodInfo.java:124)
            at retrofit.RestMethodInfo.parseParameters(RestMethodInfo.java:443)
            at retrofit.RestMethodInfo.init(RestMethodInfo.java:131)

我想我想要它做的是以某种方式将我的对象转换为 json 并将其发送到我的服务器。我是否以正确的方式处理这个问题?

【问题讨论】:

【参考方案1】:

错误是由于没有在 Order 参数上提供 @Body 注释。改成:

@POST(URL_ORDERS)
public void newOrder(@Body Order order, Callback<Boolean> success);

Retrofit 默认使用Gson 序列化和反序列化 JSON。 Gson 默认使用变量名进行序列化,但可以使用注解@SerializedName("replacement_name") 更改它们。

例如,如果您的 Order 类看起来像这样:

public class Order 
    @SerializedName("custom_id")
    private int id;
    private String name;
    private List<Item> items;


public class Item 
    private int id;
    private String name;

然后 Gson 会自动将其序列化为


    "custom_id": 1,
    "name": "Hello Object",
    "items": [
        
            "id": 1,
            "name": "Hello Item"
        
    ]

【讨论】:

对! :) 这就是我的想法。我不知道为什么会出现错误:/(我的 Order 类看起来几乎和你写的一样) 如果要发送 List 会怎样? @JamesMcCracken 如果您提供 /@Query 注释,则无法提供 /@Body。 @IgorGanapolsky 如果我们需要查询和正文注释怎么办? @JamesMcCracken 你能告诉我如何使用 servlet 中的 getParameter() 方法获取服务器上的订单值吗?

以上是关于安卓改造 |发布自定义对象(将 json 发送到服务器)的主要内容,如果未能解决你的问题,请参考以下文章

改造 2 - 如何传递 POST json 对象

单击一行后,Extjs 4 网格自定义添加一个带有文本字段的面板

Swift 4 如何将自定义对象数组转换为 JSON

post发送JSON数据(字符串、数组、字典、自定义对象)给服务器

我可以将自定义对象发送到 Android Wear 吗?

使用 JSON 参数改造 GET 请求