HttpURLConnection은 Java에서 WEB 리소스를 요청하는 데 사용할 수 있습니다.
1. URL 요청
은 GET 요청과 POST 요청의 두 가지 범주로 나뉩니다. 둘 사이의 차이점은 다음과 같습니다.
a:) get 요청은 정적 페이지를 얻을 수도 있고, URL 문자열 뒤에 매개변수를 넣고 서블릿에 전달할 수도 있습니다.
b:) post와 get의 차이점은 다음과 같습니다. get은 해당 게시물입니다. 매개변수는 URL 문자열이 아닌 http 요청 본문에 배치됩니다.
2. URLConnection 객체 문제
Java 코드
URL url = new URL("http://localhost:8080/TestHttpURLConnectionPro.do " );
URLConnection rulConnection = url.openConnection(); // 여기의 urlConnection 객체는 실제로 URL을 기반으로 합니다.
// 요청 프로토콜(여기서는 URLConnection 클래스
// http에 의해 생성된 HttpURLConnection 하위 클래스이므로
// HttpURLConnection 유형의 객체로 변환하는 것이 가장 좋습니다. > // HttpURLConnection에 대한 추가 API는 다음과 같습니다. HttpURLConnection httpUrlConnection = (HttpURLConnection) rulConnection; 3. 🎜 >Java 코드
// httpUrlConnection으로 출력할지 여부를 설정합니다. 게시 요청이므로 매개변수는
// http 본문에 있어야 하므로 기본적으로 true로 설정됩니다.
httpUrlConnection.setDoOutput(true);
// httpUrlConnection에서 읽을지 여부를 설정합니다. 기본값은 true입니다. ;
httpUrlConnection.setDoInput(true);
// 게시 요청은 캐시를 사용할 수 없습니다.
httpUrlConnection.setUseCaches(false); 🎜>
// 전송되는 콘텐츠 유형을 직렬화 가능한 Java 객체로 설정
// (이렇게 설정하지 않으면 직렬화된 객체 전송 시 기본 WEB 서비스가 이 유형이 아닙니다.
httpUrlConnection.setRequestProperty("Content-type", "application/x-java-serialized-object")
// Set 지정된 요청 방법은 "POST"이며 기본값은 GET
httpUrlConnection.setRequestMethod("POST")
// 연결 , 위 항목 2의 url에서 .openConnection() 연결하기 전에 이 지점까지의 구성을 완료해야 합니다. httpUrlConnection.connect()
4.HttpURLConnection 연결 문제
Java 코드
// 여기서 getOutputStream은 암시적으로 연결됩니다(즉, 위의 connect() 메서드를 호출하는 것과 같습니다.
// 따라서 위의 connect를 호출할 필요가 없습니다. () 개발 중).
OutputStream outStrm = httpUrlConnection.getOutputStream();
5. HttpURLConnection 데이터 쓰기 및 전송 문제
Java 코드
/ / 이제 출력 스트림 객체를 통해 객체 출력 스트림 객체를 빌드하여 직렬화 가능한 객체를 출력합니다.
ObjectOutputStream objOutputStrm = new ObjectOutputStream(outStrm);
// 객체 출력 스트림에 데이터를 쓰고, 해당 데이터는 메모리 버퍼에 저장됩니다.
objOutputStrm.writeObject(new String("I am test data"));
// 객체 출력 스트림을 새로 고치고 모든 바이트를 잠재적 스트림(일부 ObjectOutputStream)에 씁니다.
objOutputStm.flush();
// 스트림 객체를 닫습니다. 이때는 더 이상 객체 출력 스트림에 쓸 수 없습니다. 이전에 쓴 데이터가 메모리 버퍼에 존재합니다.
// 준비된 http 요청은 아래 getInputStream() 함수가 호출될 때만 이루어집니다. . 공식적으로 서버에 전송됩니다.
objOutputStm.close();
// HttpURLConnection 연결 객체의 getInputStream() 함수를 호출합니다.
// 메모리 저장 버퍼에 캡슐화된 완전한 HTTP 요청 메시지가 서버로 전송됩니다.
InputStream inStrm = httpConn.getInputStream(); // <===실제로 요청을 보내는 코드 세그먼트는 여기에 있습니다.
// 위의 httpConn .getInputStream() 메소드가 호출되어 이 HTTP 요청이 종료되었으며 객체 출력 스트림에 대한 다음 출력은 의미가 없습니다.
// 객체 출력 스트림이 close() 메소드를 호출하지 않더라도. , 다음 작업은 개체 출력 스트림에 데이터가 기록되지 않습니다
// 따라서 데이터를 다시 보내려면 연결을 다시 만들고, 매개변수를 재설정하고, 스트림 개체를 다시 만들고, 데이터를 다시 써야 합니다.
/ / 데이터를 다시 보냅니다(이러한 작업을 반복해야 하는지 여부) 조사)
objOutputStm.writeObject(new String(""))
httpConn.getInputStream(); 🎜>
6. Post 매개변수 메서드 Java 코드 OutputStream os = httpConn.getOutputStream() String param = new String () param = "CorpID =" + CorpID + "&LoginName=" + LoginName+ "&send_no=" + 전화번호 + " &msg=" + java.net.URLEncoder.encode(msg,"GBK "); ; os.write(param.getBytes()); 7 . 프로그램이 정지될 수 있는 네트워크 이상을 방지하기 위한 시간 초과 설정 Java 코드 System.setProperty("sun.net.client.defaultConnectTimeout", "30000 "); System.setProperty(" sun.net.client.defaultReadTimeout", "30000"); 위치: sun.net.client.defaultConnectTimeout: 호스트 연결 시간 초과(단위: 밀리초) sun.net.client.defaultReadTimeout: 호스트에서 데이터 읽기 시간 초과(단위: 밀리초) JDK 1.5 이전 버전에서는 네트워크 시간 초과를 제어하기 위해 이 두 가지 시스템 속성만 설정할 수 있습니다. 1.5에서는 HttpURLConnection의 상위 클래스 URLConnection의 다음 두 가지 메소드를 사용할 수도 있습니다. setConnectTimeout: 연결 호스트 시간 제한 설정(단위: 밀리초) setReadTimeout: 읽기 시간 제한 설정 호스트의 데이터(단위: 밀리초) 예: HttpURLConnection urlCon = (HttpURLConnection)url.openConnection() urlCon. setConnectTimeout(30000); urlCon.setReadTimeout(30000); 요약: >a: 연결( ) HttpURLConnection의 기능은 실제로 서버와의 tcp 연결만 설정하고 실제로 http 요청을 보내지 않습니다.post든 get이든 실제로 http 요청은 HttpURLConnection의 getInputStream() 함수가 호출될 때까지 공식적으로 전송되지 않습니다.
b: POST를 사용하여 URL 요청을 보낼 때 URL 요청 매개변수가 설정되는 순서가 최우선입니다.연결 개체의 모든 구성(설정된 기능)
이 완료되기 전에 완료되어야 합니다. connect() 함수가 실행됩니다. OutputStream에 대한 쓰기 작업은 inputStream에 대한 읽기 작업보다 선행해야 합니다.순서는 실제로 http 요청 형식에 따라 결정됩니다.
inputStream 읽기 작업이 outputStream 쓰기 작업보다 먼저 발생하면 예외가 발생합니다.
java.net.ProtocolException: Cannot write output after reading input....
c:http 요청 실제로는 두 부분으로 구성됩니다.
하나는 http 헤더이고, 이 http 요청에 대한 모든 구성은 http 헤더에 정의되며,
하나는 텍스트 콘텐츠입니다.
connect() 함수는 HttpURLConnection 객체의 구성 값을 기반으로 http 헤더 정보를 생성하므로 연결 함수를 호출하기 전에
에서 모든 구성을 준비해야 합니다.
d: http 헤더 바로 뒤에는 http 요청의 본문이 있습니다.
실제로 OutputStream은 네트워크 스트림이 아닙니다. 입력은 즉시 네트워크로 전송되지 않지만
메모리 버퍼에 존재하게 되며, 출력 스트림이 닫히면 입력 내용을 기반으로 http 본문이 생성됩니다.
이제 http에서 요청한 모든 것이 준비되었습니다. getInputStream() 함수가 호출되면 준비된 http 요청
이 공식적으로 서버로 전송되고, 그런 다음 이 http 요청에 대한 서버의 반환 정보를 읽기 위한 입력 스트림이 반환됩니다. getInputStream 중 http
요청이 전송되었으므로(http 헤더 및 본문 포함) 연결 객체를 설정하거나(http 헤더 정보 수정) getInputStream() 함수 이후에 outputStream에 씁니다
(텍스트 수정)
이러한 작업을 수행하면 예외가 발생합니다.