web-dev-qa-db-ja.com

Android Retrofit |カスタムオブジェクトを投稿(jsonをサーバーに送信)

次のように、レトロフィットを使用してカスタムオブジェクトを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に変換してサーバーに送信することです。私はこれに正しい方法で取り組んでいますか?

14
FRR

エラーは、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"
        }
    ]
}
_
28
James McCracken