1

Express 3.0 を実行している Node.js サーバーを使用しています。

アプリケーションの一部で、json を URI に POST して、/api/transactions/powerup でパワーアップを購入します。これにはいくつかの返品オプションがあります。

トランザクションが有効であることを意味する 201 と、資金不足のためにリクエストが無効であることを示す 404 のいずれかを受け取ります。私の問題は、ResponseEntity にあるヘッダーのみに基づいて成功したかどうかを Android クライアントに伝えたい場合です。

クライアントに返されるjson はありません。HTTP コードが成功したかどうかを教えてくれるからです。誰もこれを行う方法を知っていますか?

PowerupPurchase purchase = new PowerupPurchase();
purchase.setPowerId(params[0]);
final String url = getString(R.string.external_api_url) + "/transactions/powers?apiKey="+mCurrentUser.getApiKey();

Log.i(TAG,url);
// create the headers
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
requestHeaders.setAcceptEncoding(ContentCodingType.GZIP);
requestHeaders.setContentType(MediaType.APPLICATION_JSON);

// Create the Json that will be exchanged
HttpEntity<?> requestEntity = new HttpEntity<PowerupPurchase>(purchase, requestHeaders);
// Create a new RestTemplate instance
RestTemplate restTemplate = new RestTemplate();

MappingJacksonHttpMessageConverter converter = new MappingJacksonHttpMessageConverter();
List<MediaType> mediaList = new LinkedList<MediaType>();
mediaList.add(new MediaType("application","octet-stream",Charset.forName("UTF-8")));
converter.setSupportedMediaTypes(mediaList);
restTemplate.getMessageConverters().add(converter);

   try {
        // Make the network request
    ResponseEntity<?> response = restTemplate.postForEntity(url, requestEntity, Object.class);
    // HOW DO I GET THE HEADERS??
        response.getHeaders()

400 は、Spring Android で常にエラーをスローするようです とにかく、http ヘッダーを確認するだけで、戻りオブジェクト マップについて心配する必要はありませんか?

4

2 に答える 2

3

DefaultResponseErrorHandlerによって使用されRestTemplate、すべての 400 および 500 シリーズの HTTP ステータス レスポンスに対して例外をスローします。1 つのオプションは、ResponseErrorHandler例外をスローしない RestTemplate リクエストでカスタムを使用することです。カスタム ハンドラーを使用するようにリクエストを変更し、予想されるステータス コードを確認できます。

// set the custom error handler
restTemplate.setErrorHandler(new CustomErrorHandler());

// make the request
ResponseEntity<Void> response = restTemplate.postForEntity(url, requestEntity, null);

// check status code
HttpStatus statusCode = response.getStatusCode();
if (statusCode == HttpStatus.CREATED) {
    // handle success
} else if (statusCode == HttpStatus.NOT_FOUND) {
    // handle error
}

例外をスローしない「空の」実装の例を次に示します。

class CustomErrorHandler implements ResponseErrorHandler {

    @Override
    public void handleError(ClientHttpResponse response) throws IOException {
    }

    @Override
    public boolean hasError(ClientHttpResponse response) throws IOException {
        return false;
    }

}

サーバーは他のステータス コードを返す可能性があるため、予想されるステータス コードを探し、それらの特定のコードに対して例外をスローしないことをお勧めします。しかし、それは単にあなたのニーズが何であるかに依存します. この例では、によって使用されるデフォルトのハンドラーを拡張RestTemplateし、予想されるステータス コードをチェックします。

class CustomErrorHandler extends DefaultResponseErrorHandler {

    @Override
    public void handleError(ClientHttpResponse response) throws IOException {
        // check for expected status codes
        if (isExpected(response.getStatusCode())) {
            return;
        }
        super.handleError(response);
    }

    @Override
    public boolean hasError(ClientHttpResponse response) throws IOException {
        // check for expected status codes
        if (isExpected(response.getStatusCode())) {
            return false;
        }
        return super.hasError(response);
    }

    private boolean isExpected(HttpStatus statusCode) {
        return (statusCode == HttpStatus.CREATED || statusCode == HttpStatus.NOT_FOUND);
    }

}
于 2013-03-06T20:10:06.273 に答える
0

確かに例外を失敗として使用できますか?

boolean success;
try{
    ResponseEntity<?> response = restTemplate.postForEntity(url, requestEntity, Object.class);
    int result = response.getHeaders().getStatus()...
    success = result >= 200 && result < 300;
}catch(Exception e){
    success = false;
}
于 2013-02-22T08:18:56.720 に答える