2013-02-22 5 views
1

Express 3.0을 실행하는 Node.js 서버로 작업하고 있습니다.ResponseEntity에서 Spring Android POST 응답 유형 응용 프로그램/옥텟 스트림

내 응용 프로그램에서 한 부분 동안 나는/jp/transactions/powerup에서 파워 업을 구매할 URI에 POST json을 게시합니다. 여기에는 몇 가지 반환 옵션이 있습니다.

나는 거래가 유효하다는 의미의 201을 받거나 자금 부족으로 인해 요청이 유효하지 않은 404를 받게됩니다. 내 문제는 만약 내가 안드로이드 클라이언트에게 그것이 ResponseEntity에있는 헤더에만 기반으로 성공했는지 알려주고 싶다.

HTTP 코드가 성공했는지 알 수 있으므로 클라이언트에 다시 전달되는 json이 없습니다. 누구든지이 작업을 수행하는 방법을 알고 있습니까?

400의 항상 봄 안드로이드에 오류가 발생하는 것

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() 
는 단순히 HTTP 헤더보고에 반환 객체지도에 대해 걱정하지 수 어쨌든이 ?

답변

3

DefaultResponseErrorHandler 모든 400 개, 500 시리즈 HTTP 상태 응답에 대한 예외가 발생합니다. 하나의 옵션은 사용자 정의 ResponseErrorHandler을 예외를 throw하지 않을 RestTemplate 요청과 함께 사용하는 것입니다.

class CustomErrorHandler implements ResponseErrorHandler { 

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

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

} 
: 여기
// 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 
} 

는 예외를 던지지 것 "빈"구현의 예입니다 : 당신이 예상되는 상태 코드를 확인 한 후 사용자 정의 핸들러를 사용하는 요청을 수정할 수 있습니다

서버가 다른 상태 코드를 반환 할 수 있으므로 예상 된 상태 코드를 찾아 예외 코드를 throw하지 않는 것이 좋습니다. 그러나 그것은 단순히 당신의 필요가 무엇인지에 달려 있습니다. 난 그냥 더 논리적 무언가가 바라고

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); 
    } 

} 
+0

감사, 큰 도움이됩니다. – deepwinter

0

확실히 예외를 사용할 수 있습니까? RestTemplate에서 사용

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; 
} 
+1

:이 예는 예상되는 상태 코드에 대한 RestTemplate 및 검사에 사용되는 기본 핸들러를 확장합니다. 캐치의 논리는 내 작은 괴짜의 마음을 아프게합니다. – jpotts18