使用JsonObjectField对post请求进行改进

时间:2015-05-30 19:53:44

标签: android retrofit

我需要发送这样的帖子请求:

{
  "request": "AppStart",
  "appKey": "d7ea9ac1-8eb0-44f8-809d-bff6944db6c7",
  "param" : {
    "somedata" : "data"
  },
  "buildId": "111111111-1111-1111-1111-11111111111"
}

我为寄存器应用编写了简单的函数:

 public interface RestClient {
        @Headers("Content-Type: application/json" )
        @FormUrlEncoded
        @POST("/")
        <T> void callMethod(
                @Field("request") String method,
                @Field("appKey") String key,
                @Field("param") JsonObject params,
        );

 public void registerUser(String key, string userID) {
       JsonObject params = new JsonObject().putProperty("userId" userID);
       api.callMethod("registerUser", key, params);
 }

这是改造日志:

  

请求= registerUser&安培; APPKEY = 123bff6944db6c7&安培; PARAM =%7B%22deviceUdid%22%3A%2276839a55470a2cd4%22%7D

如何修复我的代码?

2 个答案:

答案 0 :(得分:0)

registerUser方法中构建一个反映所需JSON结构的对象,然后使用Retrofit的@Body注释。

public void registerUser(String key, string userID) {
    CallMethodBody callMethodBody = ...
    api.callMethod(callMethodBody);
}

public interface RestClient {

    @Headers("Content-Type: application/json" )
    @FormUrlEncoded
    @POST("/")
    <T> void callMethod(@Body CallMethodBody callMethodBody);
}

这会将整个JSON字符串作为POST请求的主体发送。

答案 1 :(得分:0)

而不是@Field,您应该使用@Body

  

请求正文

     

可以指定一个对象用作HTTP请求主体   @Body注释。

@POST("/users/new") 
void createUser(@Body User user, Callback<User> cb);
     

也可以使用RestAdapter的转换器转换对象。

参考:http://square.github.io/retrofit/

您需要创建代表您的请求主体的类,例如:

public class Data {
    String request;
    String appKey;
    String buildId;

    Param param;
}

public class Param {
    String somedata;
}

接下来,您可以将此类用作请求正文:

public interface RestClient {
    @Headers("Content-Type: application/json")
    @FormUrlEncoded
    @POST("/")
    <T> void callMethod(@Body Data data);

    public void registerUser(Data data) {
        api.callMethod(data);
    }
}