Я пишу небольшое приложение для Android, которое работает с службами REST. Базовая структура ответа является: { результата: «ки/ошибка», сообщения: «некоторая строка», сущности: «либо объект или описание ошибки» }Запрос POST для службы REST в AsyncTask
типа сущности отличается друг время ответа или ошибки. Теперь я вызываю службу из AsyncTask, и мне нужно вернуть результат в поток пользовательского интерфейса.
Я использую библиотеку gson для десриализации JSON с сервера. Проблема в том, что у меня нет возможности узнать, какой у меня ответ (ok или error).
Кроме того, AsyncTask может возвращать только один тип в поток пользовательского интерфейса. Ниже приведен пример того, что я мог придумать. Мне нужно заявить, что я не программист на 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
}
}
EDIT: Я изменил сервер вернуть соответствующие HttpCodes (200 успеха, 400 для ошибок), но я до сих пор есть проблемы возвращения двух различных типов объектов из метод doinbackground, один для ошибки и другой для успеха.
У вас есть контроль над службой на стороне сервера? Потому что *** действительно *** должен возвращать соответствующий код состояния для ситуаций с ошибками (некоторый вариант 40x или 50x). Если модификация серверной части не является вариантом, вам придется использовать JsonObject для использования результата. – Perception
Я могу изменить сервер и вернуть соответствующие HttpCodes, но он все равно не даст мне решения о том, как вернуть действительный результат одной рукой и сообщение об ошибке на другом – Dimkin