2013-09-30 18 views
10

Próbuję POST obiektu JSONObject przy użyciu biblioteki Retrofit, ale gdy widzę żądanie po stronie odbierającej, długość treści to 0.CIAŁ POST JEST przy użyciu Retrofitu

W interfejsie RestService:

@Headers({ 
     "Content-type: application/json" 
}) 
@POST("/api/v1/user/controller") 
void registerController( 
    @Body JSONObject registrationBundle, 
    @Header("x-company-device-token") String companyDeviceToken, 
    @Header("x-company-device-guid") String companyDeviceGuid, 
    Callback<JSONObject> cb); 

I to jest wywoływana z,

mRestService.registerController(
    registrationBundle, 
    mApplication.mSession.getCredentials().getDeviceToken(), 
    mApplication.mSession.getCredentials().getDeviceGuid(), 
    new Callback<JSONObject>() { 
     // ... 
    } 
) 

I jestem pewien, że registrationBundle, który jest JSONObject nie jest null lub puste (inne pola są z pewnością w porządku). W chwili złożenia wniosku wylogowuje się jako: {"zip":19312,"useAccountZip":false,"controllerName":"mine","registrationCode":"GLD94Q"}.

Po stronie odbiorcy żądania widzę, że żądanie ma numer Content-type: application/json, ale ma numer Content-length: 0.

Czy istnieje powód, dla którego wysyłanie JSON w takim ciele nie działa? Czy brakuje mi czegoś prostego w użyciu Retrofitu?

+0

Choć nie jest to odpowiedź, stwierdziliśmy, że najlepszym rozwiązaniem dla mnie było całkowicie zrezygnować z biblioteki modernizacji. Skończyło się na zastosowaniu androidasync loopj, który jest bardzo łatwy w użyciu dla wszystkich wywołań REST. Możesz publikować cokolwiek, niezależnie od typu treści i/lub, i jakiego typu wywołania zwrotnego potrzebujesz. Może to pomoże każdemu na to spojrzeć. – adityajones

Odpowiedz

30

Domyślnie nie trzeba ustawiać żadnych nagłówków, aby uzyskać treść żądania JSON. Za każdym razem, gdy testujesz kod Retrofitu, zalecam ustawienie .setLogLevel(RestAdapter.LogLevel.FULL) na twoim przykładzie RestAdaptera. Spowoduje to wyświetlenie pełnych nagłówków i treści żądania, a także pełnych nagłówków i treści odpowiedzi.

To, co się dzieje, polega na dwukrotnym ustawianiu typu zawartości. Następnie przekazujesz obiekt JSONObject, który jest przekazywany przez GsonConverter i jest zniekształcony, aby wyglądał jak {"nameValuePairs":YOURJSONSTRING}, gdzie YOURJSONSTRING zawiera pełne, zamierzone wyjście JSON. Z oczywistych powodów nie zadziała to dobrze w przypadku większości interfejsów REST API.

Powinieneś pominąć mieszanie z nagłówkiem Content-Content, który jest już domyślnie ustawiony na JSON z UTF-8. Ponadto nie należy przekazywać obiektu JSONObject do GSON. Przekaż obiekt Java dla GSON do przekonwertowania.

Spróbuj tego jeśli używasz wywołań zwrotnych:

@POST("/api/v1/user/controller") 
void registerController(
    @Body MyBundleObject registrationBundle, 
    @Header("x-company-device-token") String companyDeviceToken, 
    @Header("x-company-device-guid") String companyDeviceGuid, 
    Callback<ResponseObject> cb); 

nie testowałem dokładnie ten składnię.

Synchronous przykład:

@POST("/api/v1/user/controller") 
ResponseObject registerController(
    @Body MyBundleObject registrationBundle, 
    @Header("x-company-device-token") String companyDeviceToken, 
    @Header("x-company-device-guid") String companyDeviceGuid); 
+14

+1 dla końcówki setLogLevel –

+0

Wydaje mi się, że dotyczy to tylko Retrofit

+1

Tak. Spójrz na datę. 31.12.2013. – colintheshots

Powiązane problemy