Retrofit: 在安卓中向服务器发送POST请求

6

我正在使用Retrofit来调用API。我向API发送POST请求,但在回调中我得到了一个空的JSON,就像这样 {}。

下面是RetrofitService的代码:

@POST("/com/searchusers.php")
void getUser(@Body JSONObject searchstring, Callback<JSONObject> callBack);

需要搜索的字符串JSON格式如下{"search":"nitesh"}。我应该得到用户“nitesh”的详细信息。

以下是发送POST请求的代码

RetrofitService mRetrofitService = app.getRetrofitService();
    mRetrofitService.getUser(user, new Callback<JSONObject>() {

        @Override
        public void success(JSONObject result, Response arg1) {
            System.out.println("success, result: " + result);
        }

        @Override
        public void failure(RetrofitError error) {
            System.out.println("failure, error: " + error);
        }
    });

我得到的输出是 成功,结果:{}
期望的输出是 成功,结果:{"name":"nitesh",....rest of the details}
编辑: 我尝试使用Response而不是JSONObject,像这样CallBack,然后我将原始响应转换为字符串,并获得了预期的结果。但问题是它是字符串,我想要的是JSONObject响应。
如何使用CallBack获得精确结果...?
2个回答

7

在等待最佳回答之后,我考虑回答自己的问题。以下是我解决问题的方法。

我改变了RetrofitService的RestAdapter转换器,并创建了自己的转换器。以下是我的StringConverter:

static class StringConverter implements Converter {

    @Override
    public Object fromBody(TypedInput typedInput, Type type) throws ConversionException {
        String text = null;
        try {
            text = fromStream(typedInput.in());
        } catch (IOException ignored) {/*NOP*/ }

        return text;
    }

    @Override
    public TypedOutput toBody(Object o) {
        return null;
    }

    public static String fromStream(InputStream in) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(in));
        StringBuilder out = new StringBuilder();
        String newLine = System.getProperty("line.separator");
        String line;
        while ((line = reader.readLine()) != null) {
            out.append(line);
            out.append(newLine);
        }
        return out.toString();
    }
}

然后我将这个转换器设置到应用程序类中的RestAdapter中。
RestAdapter restAdapter = new RestAdapter.Builder()
        .setEndpoint(BASE_URL)
        .setConverter(new StringConverter())
        .build();
    mRetrofitService = restAdapter.create(RetrofitService.class);

现在每当我使用Retrofit时,我会得到一个String类型的响应。然后,我将这个String类型转换成JSONObject。

RetrofitService mRetrofitService = app.getRetrofitService();
mRetrofitService.getUser(user, new Callback<String>() {

    @Override
    public void success(String result, Response arg1) {
        System.out.println("success, result: " + result);
        JSONObject jsonObject = new JSONObject(result);
    }

    @Override
    public void failure(RetrofitError error) {
        System.out.println("failure, error: " + error);
    }
});

因此,我得到了JSON格式的结果。然后按照要求解析了这个JSON。

mRetrofitService.getUser(user, new Callback<JSONObject>() 和 public void success(String result, Response arg1)。要么 JSONObject 应该是字符串,要么 String result 应该是 JSONObject result。我尝试了你的代码并发现了这个问题。 - Muhammad Irfan
我已经更正了代码,使用Callback<String>代替Callback<JSONObject> - Vicky Chijwani

-3

这可能会对你有所帮助

JSONObject responseJsonObj = new JSONObject(responseString);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接