예, 늦었다는 것을 알고 있지만 누군가는 아마 이로부터 혜택을받을 것입니다.
Retrofit2 사용 :
지난 밤에 Volley에서 Retrofit2로 마이그레이션하는이 문제에 부딪 쳤습니다 (OP 상태에서는 이것이 Volley에 내장되어 있음 JsonObjectRequest
). Jake의 대답은 Retrofit1.9 에 대한 올바른 대답 이지만 Retrofit2에는 없습니다 TypedString
.
내 경우는 송신 요구 Map<String,Object>
, 일부는 null 값을 포함 할 수있는을 된 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())
}