0

我正在编写一些适用于 REST 服务的小型 android 应用程序。响应的基本结构是: { result: "ok/error", message: "some string", entity: "either object or error description" }

每次响应是好的还是错误的,实体类型都不同。现在,我从 AsyncTask 调用服务,我需要将结果返回给 UI 线程。

我正在使用 gson 库从服务器反序列化 JSON。问题是我无法知道我得到了什么类型的响应(正常或错误)。

此外,AsyncTask 只能将单一类型返回给 UI 线程。下面是我能想到的一个例子。我需要声明我不是 java 程序员,我可能不知道所有的模式,也许我错过了一些东西。

无论如何,我会很高兴得到任何帮助。

public class RegisterProxyAsync extends AsyncTask<User, String, Object> {

@Override
protected Object doInBackground(User... params) {
    try {
        Gson gson = new Gson();
        String request = gson.toJson(params[0]);

        HttpClient client = new DefaultHttpClient();
        HttpPost postAction = new HttpPost("http://SomeServiceEndpoint/register");
        postAction.addHeader(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
        postAction.setEntity(new StringEntity(request));

        HttpResponse response = client.execute(postAction);
        if (response != null) {
            InputStream stream = response.getEntity().getContent();
            String strResult = CharStreams.toString(new InputStreamReader(stream));
            try {
                UserResponse userResponse = gson.fromJson(strResult, UserResponse.class);
                return userResponse;
            } catch (Exception e) {
                ErrorResponse errorResponse = gson.fromJson(strResult, ErrorResponse.class);
                return errorResponse;
            }

            Log.e("debug", strResult);
        }
    } catch (Exception e) {
        // TODO:Handle exception
        e.printStackTrace();
    }

    return null;
}

@Override
protected void onPostExecute(Object result) {
    // TODO: execute some work
}

}

编辑:我已更改服务器以返回正确的 HttpCodes(200 表示成功,400 表示错误)但是,我仍然遇到从 doinbackground 方法返回两种不同类型的对象的问题,一种用于错误,另一种用于成功。

4

1 回答 1

1

一个适当的 REST 服务应该包含一个 HTTP 响应代码,指示已处理请求的状态。如果您可以控制该服务,那么我建议您更改它以返回 40x 或 50x 代码的变体,以表明发生了错误。如果请求成功,服务应该只返回 200 OK。在您的客户端,您将根据状态代码解析响应(正常实体表示 200 ok,错误实体表示其他任何内容)。伪代码:

if(response.getStatusLine().getStatusCode() == 200) {
    UserResponse userResponse = gson.fromJson(strResult, UserResponse.class);
} else {
    ErrorResponse errorResponse = gson.fromJson(strResult, ErrorResponse.class);
}

如果您出于某种原因无法更改服务器端,那么在您的客户端,您将不得不使用泛型JsonObject来解析响应。伪代码:

JSONObject jsonObj = new JSONObject(strResult);
if("ok".equals(jsonObj.get("result")) {
    return gson.fromJson(jsonObj.toString(), UserResponse.class);
} else {
    return gson.fromJson(jsonObj.toString(), ErrorResponse.class);
}
于 2013-02-20T20:46:18.880 回答