0

私はRESTサービスで動作するいくつかの小さなAndroidアプリケーションを書いています。応答の基本構造は次のとおりです。{結果: "ok / error"、メッセージ: "some string"、エンティティ:"オブジェクトまたはエラーの説明"}

エンティティタイプは、応答が正常かエラーかによって毎回異なります。ここで、AsyncTaskからサービスを呼び出しており、結果をUIスレッドに返す必要があります。

サーバーからJSONをdesirializeするためにgsonライブラリを使用しています。問題は、自分が受けた応答のタイプ(OKまたはエラー)を知ることができないことです。

また、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メソッドから2つの異なるタイプのオブジェクトを返すという問題があります。1つはエラー用、もう1つは成功用です。

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 に答える