我正在编写一些适用于REST服务的小型Android应用程序。 响应的基本结构是: { 结果:“ok / error”, 消息:“一些字符串”, 实体:“对象或错误描述” }
每次实体类型都不同,无论响应是好还是错误。 现在,我从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方法返回两个不同类型的对象的问题,一个用于错误,另一个用于成功。
答案 0 :(得分: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);
}