改造POST原始字符串体

时间:2016-03-08 15:10:37

标签: android retrofit2

我正在使用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 = nullstatus = 200。我究竟做错了什么?预期的响应只是一个字符串而不是JSON数组。

2 个答案:

答案 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) {
        }
    });