gpt4 book ai didi

java - AsyncTask 中向 REST 服务发出 POST 请求

转载 作者:行者123 更新时间:2023-12-01 14:49:55 24 4
gpt4 key购买 nike

我正在编写一些与 REST 服务配合使用的小型 Android 应用程序。响应的基本结构是:{结果:“确定/错误”,消息:“一些字符串”,实体:“对象或错误描述”}

无论响应是正确还是错误,每次实体类型都不同。现在,我从 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 方法返回两种不同类型的对象的问题,一种表示错误,另一种表示成功。

最佳答案

正确的 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);
}

关于java - AsyncTask 中向 REST 服务发出 POST 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14989406/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com