web-dev-qa-db-ja.com

レトロフィット:クラスの@Bodyコンバーターを作成できません

次のjsonをレトロフィット2で送信する必要があります。

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

ヘッダーあり:_Authorization: access_token_value_

私はこれを試しました:

_//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();
_

しかし、例外を受け取るたびに:Java.lang.IllegalArgumentException: Unable to create @Body converter for class com.google.gson.JsonObject (parameter #2)

どうすれば送信できますか?または私がそれをどのように行うことができるか別のアイデア。 jsonを内部に含む単純なStringのパラメーターを提供することもできます。それは私に合います

13
neustart47

ソリューション:次のインターフェースで本体の値を宣言します。

_@Body RequestBody body_およびラップ文字列JSONオブジェクト:

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

18
neustart47

Body単一のリクエストオブジェクトを使用し、リクエストオブジェクトを次のように宣言します

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

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

私はあなたのサービスIConstructSecureAPIエンドポイントが次のとおりであることを想定しています:

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

そしてあなたはあなたの欲望を宣言することができますResponse

これをチェックしてください answer 、クラスの代わりにHashMapを使用します。

1

このようなレトロフィットを作成するときにコンバータを指定できます

Retrofit retrofit = new Retrofit.Builder()
        .addConverterFactory(GsonConverterFactory.create())
        .baseUrl(baseurl)
        .client(okHttpClient)
        .build();
0
Emanuel

インターセプターを使用して、各リクエストで承認ヘッダーを送信できます

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);
    }
}
0
Darien Alvarez

複数の変数/フィールド/タグに対して同じ@SerializedName( "")を維持する可能性があります

0
Mohd Qasim