はい、私はそれが遅いことを知っていますが、誰かがおそらくこれから利益を得るでしょう。
Retrofit2の使用:
私は昨夜、この問題をVolleyからRetrofit2に移行しました(OP状態では、これはを使用してVolleyに直接組み込まれましたJsonObjectRequest
)。Jakeの答えはRetrofit1.9の正しいものですが、Retrofit2にはありませんTypedString
。
私の場合は、送信側の必要はありませんMap<String,Object>
(と飛ばないだろうというJSONObjectに変換し、いくつかのヌル値を含むことができることを@FieldMap
、どちらも特殊な文字は、いくつかのGETは変換さん)、次の@bnormsがヒントので、とで述べたようにスクエア:
@Bodyアノテーションを使用して、オブジェクトをHTTPリクエスト本文として使用するように指定できます。
オブジェクトは、Retrofitインスタンスで指定されたコンバーターを使用して変換されます。コンバーターが追加されていない場合は、RequestBodyのみを使用できます。
したがって、これはRequestBody
and を使用したオプションResponseBody
です。
あなたのインターフェース@Body
でRequestBody
public interface ServiceApi
{
@POST("prefix/user/{login}")
Call<ResponseBody> login(@Path("login") String postfix, @Body RequestBody params);
}
呼び出しポイントでを作成しRequestBody
、それをMediaTypeとして記述し、JSONObjectを使用してマップを適切な形式に変換します。
Map<String, Object> jsonParams = new ArrayMap<>();
//put something inside the map, could be null
jsonParams.put("code", some_code);
RequestBody body = RequestBody.create(okhttp3.MediaType.parse("application/json; charset=utf-8"),(new JSONObject(jsonParams)).toString());
//serviceCaller is the interface initialized with retrofit.create...
Call<ResponseBody> response = serviceCaller.login("loginpostfix", body);
response.enqueue(new Callback<ResponseBody>()
{
@Override
public void onResponse(Call<ResponseBody> call, retrofit2.Response<ResponseBody> rawResponse)
{
try
{
//get your response....
Log.d(TAG, "RetroFit2.0 :RetroGetLogin: " + rawResponse.body().string());
}
catch (Exception e)
{
e.printStackTrace();
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable throwable)
{
// other stuff...
}
});
これが誰にも役立つことを願っています!
上記のエレガントなKotlinバージョン。アプリケーションコードの残りの部分でJSON変換からパラメーターを抽象化できます。
interface ServiceApi {
fun login(username: String, password: String) =
jsonLogin(createJsonRequestBody(
"username" to username, "password" to password))
@POST("/api/login")
fun jsonLogin(@Body params: RequestBody): Deferred<LoginResult>
private fun createJsonRequestBody(vararg params: Pair<String, String>) =
RequestBody.create(
okhttp3.MediaType.parse("application/json; charset=utf-8"),
JSONObject(mapOf(*params)).toString())
}