2014-01-27 2 views
0

GET 메서드를 사용하여 HttpURLConnection을 사용하고 InputStream을 통해 응답을 검색하는 REST API를 여러 번 호출하려고합니다.여러 개의 HttpURLConnection 호출이 발생 함 InputStream을 사용하여 파일 끝 조기 끝내기

그것은 3 개월 이전에 잘 작동하지만, 지금은 예외 아래 던지고 :

SAXException를가 getArtifactsUrl 방법 : org.xml.sax.SAXParseException 동안 발생했습니다; 파일 조기 종료. (알 수없는 소스) [xercesImpl.jar : 6.1.0.Final] org.apache.xerces.parsers.DOMParser.parse에서 6.1.0.Final] javax.xml.parsers.DocumentBuilder.parse (DocumentBuilder.java:121)에서 [: 1.7.0_03]

다음

내가 만들고있어 코드의 라인 응답을 구문 분석 할 두 번째 호출 :

request = (HttpURLConnection) endpointUrl.openConnection();    
inputstream = request.getInputStream();    
doc = dBuilder.parse(inputstream); 

첫 번째 호출은 요청 및 입력 스트림 개체를 사용하여 정상적으로 작동하지만 두 번째 호출은 fa입니다. iling. 나는 구글에있는 모든 가능한 대답하지만 행운을 시도 : 를 호출 할 때마다 후 :

inputstream.close(); 
request.disconnect(); 

는 요청이 HttpURLConnection의 개체입니다 기억하십시오.

나는 이것이 고등부 생산 문제이기 때문에 이것을 해결할 수 있다면 정말 감사드립니다!

답변

0

먼저 오류 사례를 확인하고 항상 오류 상황을 확인하지 않아야합니다.

이 시도 :

request = (HttpURLConnection) endpointUrl.openConnection();    

request.connect(); // not really necessary (done automatically) 
int statusCode = request.getResponseCode(); 
if (statusCode == 200) { // or maybe other 2xx codes? 

    // Success - should work if server gives good response 
    inputstream = request.getInputStream(); 

    // if you get status code 200 and still have the same error, you should 
    // consider logging the stream to see what document you get from server. 
    // (see below *) 

    doc = dBuilder.parse(inputstream); 

} else { 

    // Something happened 

    // handle error, try again if it makes sense, ... 
    if (statusCode == 404) ... // resource not found 
    if (statusCode == 500) ... // internal server error 

    // maybe there is something interesting in the body 

    inputstream = request.getErrorStream(); 
    // read and parse errorStream (but probably this is not the body 
    // you expected) 

} 

List of HTTP status codes에서보세요.

일부 불쾌한 경우에는 HttpURLConnection 뒤에 앉아 있으면 쉽게 감지 할 수없는 다른 문제가 있습니다. 그런 다음 적절한 도구 (인프라, 권한, OS 등에 따라 다름)로 TCP/IP 트래픽을 로깅하거나 스누핑 할 수 있습니다. This SO post 당신을 도울 수 있습니다.

*) 귀하의 경우에는 오류가없는 상태 코드가 서버에서 나오지만 파싱 할 수없는 XML이 있다고 가정합니다. 트래픽 로깅이 당신의 일이 아니라면, 당신은 InputStream을 읽고, 그것을 파일에 쓰고, 이전처럼 스트림을 처리 할 수 ​​있습니다. 물론 스트림을 ByteArrayOutputStream에 기록하고 바이트 []를 가져 와서 해당 바이트를 파일에 쓴 다음이를 ByteArrayInputStream으로 변환하여 XML 파서에 제공 할 수 있습니다. 또는 Commons IO TeeInputStream을 사용하여이를 처리 할 수 ​​있습니다.

connection.getResponseCode()이 예외를 throw하는 경우가 있습니다. 그런 다음 HTTP 헤더를 구문 분석 할 수 없었습니다. 이것은 서버 소프트웨어, 하드웨어 또는 방화벽, 프록시 또는로드 밸런서가 이상하게 작동하지 않는 경우에만 발생해야합니다.

한 가지 더 : HTTP 클라이언트 라이브러리를 선택하고 HttpURLConnection을 직접 사용하지 않는 것이 좋습니다.

+0

죄송합니다. 나는이 문제가 우리의 두 번째 서비스 호출에서 302의 응답 코드와 함께 있다는 것을 알아 냈다.따라서 다른 파트너와 확인하고 코드에서 적절하게 처리해야합니다. 그러나이 답변을 주셔서 감사 드리며 HttpURLConnection을 사용하여 RESTful 서비스를 호출하려고 할 때 위와 동일한 방법을 권장합니다. – user3242315

+0

'HttpURLConnection.setInstanceFollowRedirects (true) '를 호출하면 수동으로 처리 할 필요가 없습니다. 그러나 이것은 프로토콜 (http -> https 또는 vv.)의 전환이없고 GET 요청을 사용할 때만 작동합니다. 안드로이드에서 BTW는 버전에 달려 있습니다. – hgoebl

+0

우리의 경우에는 프로토콜의 전환 (http -> https)이므로 코드에서 적절히 처리해야합니다. – user3242315

관련 문제