2015-05-30 2 views
0

мне нужно отправить почтовые запросы, как это:дооснащения с JsonObjectField

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

Я пишу простую функцию для регистра appllication:

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% 2276839a55470a 2cd4% 22% 7D

Как исправить мой код?

ответ

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.

0

Вместо @Field вы должны использовать @Body.

Запрос Body

Объект может быть определен для использования в качестве тела запроса HTTP с @body аннотации.

@POST("https://stackoverflow.com/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); 
    } 
} 
+0

Если у меня есть 200 методов, мне нужно создать 200 очень простые классы для Params. Есть ли лучший способ? – punksta

+0

Вместо 'String' вы можете использовать' Map' в классе 'Param' - это исключает необходимость создания« 200 очень простых классов ». – Ziem

Смежные вопросы