2016-03-09 22 views
7

muszę wysłać następną json poprzez modernizacji 2:Modernizacja: Nie można utworzyć @Body konwerter dla klasy

{ 
    "Inspection": { 
     "UUID": "name", 
     "ModifiedTime": "2016-03-09T01:13", 
     "CreatedTime": "2016-03-09T01:13", 
     "ReviewedWith": "name2", 
     "Type": 1, 
     "Project": { 
      "Id": 41 
     }, 
     "ActionTypes": [1] 
    } 
} 

z nagłówkiem: Authorization: access_token_value

Próbowałem to:

//header parameter 
String accessToken = Requests.getAccessToken(); 

JsonObject obj = new JsonObject(); 
JsonObject inspection = new JsonObject(); 

inspection.addProperty("UUID","name"); 
inspection.addProperty("ModifiedTime","2016-03-09T01:13"); 
inspection.addProperty("CreatedTime","2016-03-09T01:13"); 
inspection.addProperty("ReviewedWith","name2"); 
inspection.addProperty("Type","1"); 

JsonObject project = new JsonObject(); 
project.addProperty("Id", 41); 

inspection.add("Project", project); 
obj.add("Inspection", inspection); 

Retrofit restAdapter = new Retrofit.Builder() 
     .baseUrl(Constants.ROOT_API_URL) 
     .addConverterFactory(GsonConverterFactory.create()) 
     .addConverterFactory(ScalarsConverterFactory.create()) 
     .build(); 
IConstructSecureAPI service = restAdapter.create(IConstructSecureAPI.class); 
Call<JsonElement> result = service.addInspection(accessToken, obj); 
JsonElement element = result.execute().body(); 

Ale za każdym razem otrzymałem wyjątek: java.lang.IllegalArgumentException: Unable to create @Body converter for class com.google.gson.JsonObject (parameter #2)

Jak mogę to wysłać? Albo jakikolwiek inny pomysł, jak mogę to zrobić. Możesz nawet zaoferować mi z parametrem jako prosty String z json wewnątrz. Będzie on odpowiadał za mną

+0

Proszę pisać IConstructSecureAPI po prostu wiedzieć, jak budujesz swoją prośbę. –

Odpowiedz

10

Rozwiązanie: deklaruje wartość ciało w interfejsie z następnym:

@Body RequestBody body i owinąć JSON String obiektu:

RequestBody body = RequestBody.create(MediaType.parse("application/json"), obj.toString());

1

Body użyć pojedynczego obiektu żądania, zadeklarować swój obiekt żądania w następujący sposób

class Inspection { 
    String UUID; 
    //..... add your fields 
    Project project;  
} 

class Product 
{ 
    int Id; 
    //....... add your fields 
} 

I zakładamy, że punkt końcowy usługi IConstructSecureAPI jest:

@GET(...) // change based on your api GET/POST 
Call<Response> addInspection(
    @Header("Authorization") String accesstoken, 
    @Body Inspection request 
); 

i można zadeklarować twoje pragnienie Response.

Sprawdź to answer, jego użycie HashMap zamiast zajęć.

0

Można użyć Interceptor wysłać autoryzacji nagłówka w każdym żądaniu

class AuthorizationInterceptor implements Interceptor { 

    @Override 
    public Response intercept(Chain chain) throws IOException { 
     Request originalRequest = chain.request(); 
     String authorizationToken = AuthenticationUtils.getToken(); 
     Request authorizedRequest = originalRequest.newBuilder() 
      .header("Authorization", authorizationToken) 
      .build(); 
     return chain.proceed(authorizedRequest); 
    } 
} 
Powiązane problemy