我正在使用Retrofit向服务器发送POST请求。 POST 的正文必须采用jdata={"key1":"value1",...}
格式,并且Content-Type标头设置为application/x-www-form-urlencoded
。我发现了similar个问题,但接受的答案无效。
这是我试过的 -
我的界面
public interface APIHandler {
@Headers("Content-Type: application/x-www-form-urlencoded")
@FormUrlEncoded
@POST(URL)
Call<ResponseBody> getdata(@Field("jdata") String jdata);
}
通话功能
public void load() {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("BASE_URL")
.addConverterFactory(GsonConverterFactory.create())
.build();
// prepare call in Retrofit 2.0
APIHandler iAPI = retrofit.create(APIHandler.class);
String requestBody = "{\"id\":\"value\",\"id1\":\"value2\"}"
Call<ResponseBody> call = iAPI.getData(requestBody);
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> c, Response<ResponseBody> response) {
if (response.isSuccess()) {
ResponseBody result = response.body();
String gs = new Gson().toJson(result);
Log.d("MainActivity", "response = " + gs + " status: " + statusCode);
} else {
Log.w("myApp", "Failed");
}
}
@Override
public void onFailure(Call<ResponseBody> c, Throwable t) {
}
});
}
但我收到了response = null
和status = 200
。我究竟做错了什么?预期的响应只是一个字符串而不是JSON数组。
答案 0 :(得分:0)
我要离开这里,这样可以帮助别人。
上面的代码是正确的。正如我在最后一行中提到的,预计会有普通字符串响应。但由于它不是JSON响应,转换可能不起作用,响应为空。我能找到的唯一解决方案是直接将响应转换为字符串 -
try {
stresp = response.body().string()
Log.d("MainActivity", "response = " + stresp + " status: " + statusCode);
} catch (IOException e) {
//Handle exception
}
可能有更好的方法来解决这个问题,但这对我有用!
答案 1 :(得分:0)
你可以这样使用。我测试过这个并且工作正常
public interface APIHandler {
@POST(URL)
Call<ResponseBody> getdata(@Body JsonObject body);
}
请求正文:
JsonObject requestBody = new JsonObject();
requestBody.addProperty("id", "value1");
requestBody.addProperty("id1", "value2");
在Retrofit 2.0中准备电话
APIHandler iAPI = retrofit.create(APIHandler.class);
和通话功能:
Call<ResponseBody> call = iAPI.getData(requestBody);
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> c, Response<ResponseBody> response) {
if (response.isSuccess()) {
String result = response.body().string();
Log.d("MainActivity", "response = " + result);
} else {
Log.w("myApp", "Failed");
}
}
@Override
public void onFailure(Call<ResponseBody> c, Throwable t) {
}
});