JAVA 의 HttpURLConnection 용법 을 읽 습 니 다.

9058 단어 JAVAHttpURLConnection
JDK 의 URLConnection 이 Servlet 를 연결 하 는 문제 에 대해 인터넷 에 언급 되 어 있 지만 특정한 문제 나 몇 가지 문 제 를 설 명 했 을 뿐 FAQ 의 방식 으로 해결 되 었 고 비교적 분산 되 었 습 니 다.지금 은 이런 사용 에 대해 본인 이 프로젝트 에서 사용 한 경험 에 대해 다음 과 같이 정리 하 겠 습 니 다.
1:>URL 요청 의 종류:
GET 와 POST 요청 두 가지 로 나 뉜 다.양자 의 차 이 는 다음 과 같다. 
     a:)get 요청 은 정적 페이지 를 가 져 올 수도 있 고 URL 문자열 뒤에 파 라 메 터 를 두 고 servlet 에 전달 할 수도 있 습 니 다. 
     b:)post 와 get 의 차이 점 은 post 의 매개 변 수 는 URL 문자열 에 넣 는 것 이 아니 라 http 요청 의 본문 에 넣 는 것 입 니 다.
2:>URLConnection 의 대상 질문:
URLConnection 의 대상,다음 코드 예제:

//    index.jsp <servlet-mapping>    
//   Servlet(com.quantanetwork.getClientDataServlet) 
//  Servlet          

URL url = new URL("http://localhost:8080/TestHttpURLConnectionPro/index.jsp"); 

URLConnection rulConnection = url.openConnection();//    urlConnection        URL  
     //     (   http)   URLConnection  
     //    HttpURLConnection,          
     //  HttpURLConnection     ,     
     // HttpURLConnection   API.  : 

HttpURLConnection httpUrlConnection = (HttpURLConnection) rulConnection; 
3:>HttpURLConnection 대상 매개 변수 문제

//      httpUrlConnection  ,     post  ,      
// http   ,      true,       false; 
httpUrlConnection.setDoOutput(true); 

//      httpUrlConnection  ,      true; 
httpUrlConnection.setDoInput(true); 

// Post          
httpUrlConnection.setUseCaches(false); 

//                java   
// (      ,         , WEB               java.io.EOFException) 
httpUrlConnection.setRequestProperty("Content-type", "application/x-java-serialized-object"); 

//         "POST",   GET 
httpUrlConnection.setRequestMethod("POST"); 

//   ,    2  url.openConnection()         connect    , 
    httpUrlConnection.connect(); 
4:>  HttpURLConnection 연결 문제:

//   getOutputStream      connect( :       connect()  , 
//             connect()   )。 
OutputStream outStrm = httpUrlConnection.getOutputStream(); 
5:>HttpURLConnection 데이터 쓰기 및 데이터 전송 문제:

//                   ,            。 
ObjectOutputStream objOutputStrm = new ObjectOutputStream(outStrm); 

//           ,              
objOutputStrm.writeObject(new String("      ")); 

//        ,             (   ObjectOutputStream) 
objOutputStm.flush(); 

//      。  ,               ,                , 
//       getInputStream()         http           
objOutputStm.close(); 

//   HttpURLConnection     getInputStream()  , 
//               HTTP          。 
InputStream inStrm = httpConn.getInputStream(); // <===  ,               

//    httpConn.getInputStream()     ,  HTTP     ,               , 
//            close()  ,                    . 
//   ,                、     、       、     、 
//       (                 ) 
objOutputStm.writeObject(new String("")); 
httpConn.getInputStream(); 
요약:
a:)HttpURLConnection 의 connect()함 수 는 실제 서버 와 tcp 연결 을 만 들 었 을 뿐 http 요청 을 실제로 보 내지 않 았 습 니 다. 
post 든 get 이 든 http 요청 은 HttpURLConnection 의 getInputStream()함수 에서 야 정식으로 보 냅 니 다. 
b:)POST 방식 으로 URL 요청 을 보 낼 때 URL 요청 매개 변수의 설정 순서 가 중요 합 니 다. connection 대상 에 대한 모든 설정(set 함수 더미) 
모두 connect()함수 가 실행 되 기 전에 완성 해 야 합 니 다.outputStream 에 대한 쓰기 동작 은 inputStream 의 읽 기 동작 전에 해 야 합 니 다. 이 순 서 는 http 에서 요청 한 형식 으로 결 정 됩 니 다. input Stream 읽 기 동작 이 output Stream 의 쓰기 동작 전에 예 외 를 던 집 니 다. 

java.net.ProtocolException: Cannot write output after reading input....... 
c:)http 요청 은 실제로 두 부분 으로 구성 되 어 있 습 니 다. 하 나 는 http 헤드 입 니 다.이번 http 요청 에 대한 모든 설정 은 http 헤드 에서 정의 합 니 다. 하 나 는 본문 콘 텐 츠. 
connect()함 수 는 HttpURLConnection 대상 의 설정 값 에 따라 http 헤더 정 보 를 생 성하 기 때문에 connect 함 수 를 호출 하기 전에 모든 설정 을 준비 해 야 합 니 다. 
d:)http 헤드 뒤에 있 는 것 은 http 요청 의 본문 입 니 다.본문의 내용 은 outputStream 흐름 을 통 해 기 록 됩 니 다. 실제로 outputStream 은 네트워크 흐름 이 아 닙 니 다.기껏해야 문자 직렬 입 니 다.안에 기 록 된 것 은 바로 네트워크 로 보 내지 않 습 니 다. 메모리 버퍼 에 존재 합 니 다.outputStream 흐름 이 닫 힐 때 입력 한 내용 에 따라 http 본문 을 생 성 합 니 다. 이로써 http 에서 요청 한 것 은 모두 준비 되 었 습 니 다.getInputStream()함수 호출 시 준 비 된 http 요청 서버 에 정식으로 보 낸 다음 입력 흐름 을 되 돌려 서버 가 이번 http 요청 에 대한 반환 정 보 를 읽 는 데 사용 합 니 다.때문에 getInputStream 에 요청 할 때 이미 보 냈 습 니 다(http 헤드 와 본문 포함).따라서 getInputStream()함수 에 있 습 니 다. 이후 connection 대상 을 설정 하거나(http 헤드 의 정 보 를 수정 합 니 다)outputStream 에 기록 합 니 다(본문 을 수정 합 니 다) 모두 무의미 하 다.이런 조작 을 실행 하면 이상 이 발생 할 수 있다.
6:>Servlet 엔 드 의 개발 주의 점:
a:)클 라 이언 트 가 보 낸 POST 형식의 HTTP 요청 에 대해 Servlet 는 doPost 방법 을 실행 해 야 하 며 doGet 방법 을 사용 할 수 없습니다.
b:)HttpServletRequest 의 getInputStream()방법 으로 InputStream 의 대상 을 얻 습 니 다.예 를 들 어: 

InputStream inStream = httpRequest.getInputStream(); 
현재 inStream.available()을 호출 합 니 다. 스 트림 읽 기(또는 건 너 뛰 기)의 예상 바이트 수 를 입력 하면 영원히 0 으로 되 돌아 갑 니 다.이 방법의 반환 값 할당 버퍼 를 사용 하려 고 합 니 다. 이 흐름 의 모든 데 이 터 를 저장 하 는 방법 은 정확 하지 않 습 니 다.그렇다면 지금의 해결책 은? 
Servlet 이 단 계 는 다음 과 같이 실 현 됩 니 다.

   InputStream inStream = httpRequest.getInputStream(); 
   ObjectInputStream objInStream = new ObjectInputStream(inStream); 
   Object obj = objInStream.readObject(); 
   //        
   // 。。。。。。 
   // 。。。 。。。 
클 라 이언 트 는 실제 데 이 터 를 보 내 든 말 든 대상 을 기록 해 야 합 니 다(이 대상 이 사용 하지 않 을 까 봐).예 를 들 어:

   ObjectOutputStream objOutputStrm = new ObjectOutputStream(outStrm); 
   objOutputStrm.writeObject(new String("")); //           
   //        null  ,            。 
   objOutputStrm.writeObject(null); 
   objOutputStrm.flush(); 
   objOutputStrm.close(); 
주의:
위 에서 대상 출력 흐름 ObjectOutputStream 을 만 들 때 HttpServletRequest 에서 가 져 온 입력 흐름 (즉:new Object OutputStream(outStrm)의 outStrm)은 Buffered OutputStream 흐름 에 포장 되 어 있 습 니 다. object OutputStrm.flush()가 있어 야 합 니 다.이 문장 은 흐 르 는 정 보 를 버퍼 출력 흐름 에 저장 할 수 있 도록 합 니 다.다음 과 같 습 니 다.

   ObjectOutputStream objOutputStrm = new ObjectOutputStream(new BufferedOutputStream(outStrm)); 
   objOutputStrm.writeObject(null); 
   objOutputStrm.flush(); // <======      . 
   objOutputStrm.close(); 
HttpURLConnection 은 HTTP 프로 토 콜 을 기반 으로 하 며,바 텀 은 socket 통신 을 통 해 이 루어 집 니 다.시간 초과(timeout)를 설정 하지 않 으 면 네트워크 가 이상 한 경우 프로그램 이 경직 되 어 계속 실행 되 지 않 을 수 있 습 니 다.다음 두 문장 을 통 해 상응하는 시간 초 과 를 설정 할 수 있다.

System.setProperty("sun.net.client.defaultConnectTimeout",         );
System.setProperty("sun.net.client.defaultReadTimeout",         );
그 중:sun.net.client.defaultConnectTimeout:호스트 연결 시간 초과(단위:밀리초)sun.net.client.defaultReadTimeout:호스트 에서 데 이 터 를 읽 는 시간 초과(단위:밀리초)
예 를 들 면:

System.setProperty("sun.net.client.defaultConnectTimeout", "30000");
System.setProperty("sun.net.client.defaultReadTime
자바 에 서 는 HttpURLConnection 을 사용 하여 WEB 자원 을 요청 할 수 있 습 니 다.
HttpURLConnection 대상 은 직접 구성 할 수 없습니다.URL.openConnection()을 통 해 HttpURLConnection 대상 을 얻어 야 합 니 다.예제 코드 는 다음 과 같 습 니 다.

String szUrl = "http://www.ee2ee.com/";
URL url = new URL(szUrl);
HttpURLConnection urlCon = (HttpURLConnection)url.openConnection(); 
HttpURLConnection 은 HTTP 프로 토 콜 을 기반 으로 하 며,바 텀 은 socket 통신 을 통 해 이 루어 집 니 다.시간 초과(timeout)를 설정 하지 않 으 면 네트워크 가 이상 한 경우 프로그램 이 경직 되 어 계속 실행 되 지 않 을 수 있 습 니 다.다음 두 문장 을 통 해 상응하는 시간 초 과 를 설정 할 수 있다.

System.setProperty("sun.net.client.defaultConnectTimeout",         );
System.setProperty("sun.net.client.defaultReadTimeout",         );
그 중:sun.net.client.defaultConnectTimeout:호스트 연결 시간 초과(단위:밀리초)sun.net.client.defaultReadTimeout:호스트 에서 데 이 터 를 읽 는 시간 초과(단위:밀리초)
예 를 들 면:

System.setProperty("sun.net.client.defaultConnectTimeout", "30000");
System.setProperty("sun.net.client.defaultReadTimeout", "30000");
JDK 1.5 이전 버 전 은 이 두 시스템 속성 을 설정 해서 만 네트워크 시간 초 과 를 제어 할 수 있 습 니 다.1.5 에 서 는 HttpURLConnection 의 부모 클래스 URLConnection 의 다음 두 가지 방법 을 사용 할 수 있 습 니 다.setConnectTimeout:호스트 연결 시간 초과 설정(단위:밀리초)setReadTimeout:호스트 에서 데 이 터 를 읽 는 시간 초과 설정(단위:밀리초)
예 를 들 면:

HttpURLConnection urlCon = (HttpURLConnection)url.openConnection();
urlCon.setConnectTimeout(30000);
urlCon.setReadTimeout(30000); 
주의해 야 할 것 은 필자 가 JDK 1.4.2 환경 에서 defaultReadTimeout 이 설 치 된 상황 에서 네트워크 시간 초과 가 발생 하면 HttpURLConnection 이 자동 으로 요청 을 다시 제출 하고 호출 을 요청 하 며 서버 에 두 번 요청 하 는 문제(Trouble)가 발생 한 다 는 것 이다.나 는 이것 이 JDK 1.4.2 의 bug 라 고 생각한다.JDK 1.5.0 에서 이 문 제 는 해결 되 었 고 자동 재발 행 현상 은 존재 하지 않 습 니 다.out", "30000");
이상 은 JDK 의 HttpURLConnection 용법 에 대한 상세 한 내용 입 니 다.JDK 의 HttpURLConnection 에 관 한 자 료 는 저희 의 다른 관련 글 을 주목 하 세 요!

좋은 웹페이지 즐겨찾기