본 장에서는 HTTP/1.1을 기준으로 작성되었으며, UTL_HTTP 패키지의 기본 개념과 패키지 내의 함수를 사용하는 방법을 설명한다.
UTL_HTTP는 웹 표준(RFC2616)인 HTTP 프로토콜에 따라 클라이언트 역할을 제공하는 패키지이다.
프로토콜을 세부 조작하거나 간단히 웹 페이지만을 얻어올 수 있는 서브 프로그램을 제공한다.
HTTP 버전의 종류를 나타낸다.
HTTP_VERSION_1 CONSTANT VARCHAR2(10) := 'HTTP/1.1';
HTTP에서 사용할 네트워크 포트 번호를 나타낸다.
DEFAULT_HTTP_PORT CONSTANT PLS_INTEGER := 80;
HTTP 프로토콜에 따라 서버로부터 응답받은 응답의 상태를 나타내는 코드이다.
상태 코드 상수의 세부 내용은 다음과 같다. 이때 상태 코드는 번호 순으로 정렬되어 있다.
HTTP_CONTINUE CONSTANT PLS_INTEGER := 100; HTTP_SWITCHING_PROTOCOLS CONSTANT PLS_INTEGER := 101; HTTP_OK CONSTANT PLS_INTEGER := 200; HTTP_CREATED CONSTANT PLS_INTEGER := 201; HTTP_ACCEPTED CONSTANT PLS_INTEGER := 202; HTTP_NON_AUTHORITATIVE_INFO CONSTANT PLS_INTEGER := 203; HTTP_NO_CONTENT CONSTANT PLS_INTEGER := 204; HTTP_RESET_CONTENT CONSTANT PLS_INTEGER := 205; HTTP_PARTIAL_CONTENT CONSTANT PLS_INTEGER := 206; HTTP_MULTIPLE_CHOICES CONSTANT PLS_INTEGER := 300; HTTP_MOVED_PERMANENTLY CONSTANT PLS_INTEGER := 301; HTTP_FOUND CONSTANT PLS_INTEGER := 302; HTTP_SEE_OTHER CONSTANT PLS_INTEGER := 303; HTTP_NOT_MODIFIED CONSTANT PLS_INTEGER := 304; HTTP_USE_PROXY CONSTANT PLS_INTEGER := 305; HTTP_TEMPORARY_REDIRECT CONSTANT PLS_INTEGER := 307; HTTP_BAD_REQUEST CONSTANT PLS_INTEGER := 400; HTTP_UNAUTHORIZED CONSTANT PLS_INTEGER := 401; HTTP_PAYMENT_REQUIRED CONSTANT PLS_INTEGER := 402; HTTP_FORBIDDEN CONSTANT PLS_INTEGER := 403; HTTP_NOT_FOUND CONSTANT PLS_INTEGER := 404; HTTP_NOT_ACCEPTABLE CONSTANT PLS_INTEGER := 406; HTTP_PROXY_AUTH_REQUIRED CONSTANT PLS_INTEGER := 407; HTTP_REQUEST_TIME_OUT CONSTANT PLS_INTEGER := 408; HTTP_CONFLICT CONSTANT PLS_INTEGER := 409; HTTP_GONE CONSTANT PLS_INTEGER := 410; HTTP_LENGTH_REQUIRED CONSTANT PLS_INTEGER := 411; HTTP_PRECONDITION_FAILED CONSTANT PLS_INTEGER := 412; HTTP_REQUEST_ENTITY_TOO_LARGE CONSTANT PLS_INTEGER := 413; HTTP_REQUEST_URI_TOO_LARGE CONSTANT PLS_INTEGER := 414; HTTP_UNSUPPORTED_MEDIA_TYPE CONSTANT PLS_INTEGER := 415; HTTP_REQ_RANGE_NOT_SATISFIABLE CONSTANT PLS_INTEGER := 416; HTTP_EXPECTATION_FAILED CONSTANT PLS_INTEGER := 417; HTTP_NOT_IMPLEMENTED CONSTANT PLS_INTEGER := 501; HTTP_BAD_GATEWAY CONSTANT PLS_INTEGER := 502; HTTP_SERVICE_UNAVAILABLE CONSTANT PLS_INTEGER := 503; HTTP_GATEWAY_TIME_OUT CONSTANT PLS_INTEGER := 504; HTTP_VERSION_NOT_SUPPORTED CONSTANT PLS_INTEGER := 505;
본 절에서는 UTL_HTTP 패키지에서 제공하는 별도 정의된 타입들을 알파벳 순으로 설명한다.
서버로부터 응답받은 페이지를 문자열의 배열 형태로 받아올 때 사용하는 타입이다.
HTML_PIECES 타입의 세부 내용은 다음과 같다.
프로토타입
TYPE html_pieces IS TABLE OF VARCHAR2(2000) INDEX BY BINARY_INTEGER;
서버로 보낼 요청 정보를 담고 있는 타입이다.
프로토타입
TYPE req IS RECORD ( url VARCHAR2(32767), method VARCHAR2(64), http_version VARCHAR2(64) );
필드
필드 이름 | 설명 |
---|---|
url | 웹 페이지의 주소이며, 자세한 내용은 “40.7. URL”을 참고한다. |
method | 서버에 어떠한 종류의 메소드를 요청할지를 나타낸다. 'OPTIONS', 'GET', 'HEAD', 'POST', 'PUT', 'DELETE', 'TRACE', 'CONNECT'의 값만을 허용한다. (이외는 미지원) |
http_version | 프로토콜 버전을 나타내며, 값의 종류는 “40.2.1. HTTP 버전 상수”를 참고한다. |
서버에서 온 응답에 대한 상태 정보를 담고 있는 타입이다.
프로토타입
TYPE resp IS RECORD ( status_code PLS_INTEGER, reason_phrase VARCHAR2(256), http_version VARCHAR2(64) );
필드
필드 이름 | 설명 |
---|---|
status_code | 요청에 따른 응답에 대한 상태를 나타내는 3자리의 숫자이며, 값의 종류는 “40.2.3. 상태 코드 상수”를 참고한다. |
reason_phrase | 상태 코드에 따르는 간단한 설명이다. |
http_version | 프로토콜 버전을 나타내며, 값의 종류는 “40.2.1. HTTP 버전 상수”를 참고한다. |
다음은 UTL_HTTP 패키지에서 미리 제공된 예외이다. 자세한 내용은 “40.5. 함수”와 “40.6. 프러시저”의 "예외 사항" 항목을 참고한다.
BAD_ARGUMENT
END_OF_BODY
REQUEST_FAILED
본 절에서는 UTL_HTTP 패키지에서 제공하는 함수를 알파벳 순으로 설명한다.
웹 서버와 커넥션을 맺고, 특정 메소드를 통해 웹 서버로부터 요청을 준비한다.
BEGIN_REQUEST 함수의 세부 내용은 다음과 같다.
프로토타입
FUNCTION BEGIN_REQUEST ( url IN VARCHAR2, method IN VARCHAR2 DEFAULT 'GET', http_version IN VARCHAR2 DEFAULT NULL ) RETURN req;
파라미터
파라미터 | 설명 |
---|---|
url | 웹 페이지의 주소이며, 자세한 내용은 “40.7. URL”을 참고한다. |
method | 서버에 어떠한 종류의 메소드를 요청할지를 나타낸다. 'OPTIONS', 'GET', 'HEAD', 'POST', 'PUT', 'DELETE', 'TRACE', 'CONNECT'의 값만을 허용한다. (이외는 미지원) |
http_version | 프로토콜 버전을 나타내며, 값의 종류는 “40.2.1. HTTP 버전 상수”를 참고한다. |
예외 사항
예외 사항 | 설명 |
---|---|
REQUEST_FAILED | 잘못된 요청으로 웹 서버와 통신할 수 없는 경우에 발생한다. URL이 올바른지 또는 웹 서버가 정상적으로 동작하는지 확인한다. |
PKG_TRANSFER_TIMEOUT | 20초 이상 웹 서버로부터 응답이 없을 때 타임아웃이 발생한 경우이다. |
예제
단일 함수 사용의 예가 아니므로, “40.8. 예제”를 참고한다.
웹 서버에 요청을 보내고, 응답의 헤더를 읽고, 바디를 읽을 준비를 한다.
GET_RESPONSE 함수의 세부 내용은 다음과 같다.
프로토타입
FUNCTION GET_RESPONSE ( r IN OUT NOCOPY req ) RETURN resp;
파라미터
파라미터 | 설명 |
---|---|
r | 요청 식별자이다. |
예외 사항
예외 사항 | 설명 |
---|---|
BAD_ARGUMENT | BEGIN_REQUEST 또는 SET_HEADER를 선행하지 않고 해당 함수를 호출하거나, 파라미터를 잘못 사용하게 되는 경우 발생한다. |
예제
단일 함수 사용의 예가 아니므로, “40.8. 예제”를 참고한다.
URL을 통해 웹 서버로 요청을 보내 최대 2000bytes의 데이터를 반환하는 함수이다. 웹 서버로 요청을 보낼 경우 HTTP/1.1 표준의 GET 메소드를 이용한다.
프로토타입
FUNCTION REQUEST ( url IN VARCHAR2, proxy IN VARCHAR2 DEFAULT NULL, wallet_path IN VARCHAR2 DEFAULT NULL, wallet_password IN VARCHAR2 DEFAULT NULL ) RETURN VARCHAR2;
파라미터
파라미터 | 설명 |
---|---|
url | 웹 페이지의 주소이며, 자세한 내용은 “40.7. URL”을 참고한다. |
proxy | 프록시 서버의 이름이다. (기본값: NULL, 다음에 구현할 예정이다) |
wallet_path | 클라이언트 쪽에서 HTTPS를 사용하기 위해 필요한 인증서를 저장하는 경로이다. (기본값: NULL, 다음에 구현할 예정이다) |
wallet_password | 인증서를 보기 위한 패스워드이다. (기본값: NULL, 다음에 구현할 예정이다) |
예외 사항
예외 사항 | 설명 |
---|---|
REQUEST_FAILED | 잘못된 요청으로 웹 서버와 통신할 수 없는 경우에 발생한다. URL이 올바른지 또는 웹 서버가 정상적으로 동작하는지 확인한다. |
PKG_TRANSFER_TIMEOUT | 20초 이상 웹 서버로부터 응답이 없을 때 타임아웃이 발생한 경우이다. |
예제
DECLARE resp VARCHAR2(32767); BEGIN resp := UTL_HTTP.REQUEST('http://www.w3.org/Protocols/'); END;
HTTP 요청을 끝낸다. 이때 자원(버퍼 메모리, 소켓)이 모두 반환되고, 초기화 상태로 변경된다.
END_RESPONSE 프러시저의 세부 내용은 다음과 같다.
프로토타입
PROCEDURE END_RESPONSE ( r IN OUT NOCOPY resp );
예제
단일 함수 사용의 예가 아니므로, “40.8. 예제”를 참고한다.
현재 세션에 설정되어 있는 타임아웃 시간을 읽어온다. (기본 타임아웃 시간: 50초)
GET_TRANSFER_TIMEOUT 프러시저의 세부 내용은 다음과 같다.
프로토타입
PROCEDURE GET_TRANSFER_TIMEOUT ( timeout OUT PLS_INTEGER );
파라미터
파라미터 | 설명 |
---|---|
timeout | 세션에 설정된 타임아웃 시간이다. |
예제
DECLARE timeout PLS_INTEGER; BEGIN utl_http.get_transfer_timeout(var); END;
헤더를 제외한 요청 페이지의 바디를 읽어온다.
READ_TEXT 프러시저의 세부 내용은 다음과 같다.
프로토타입
PROCEDURE READ_TEXT ( r IN OUT NOCOPY resp, data OUT NOCOPY VARCHAR2, len IN PLS_INTEGER DEFAULT NULL );
파라미터
파라미터 | 설명 |
---|---|
r | 응답 식별자이다. |
data | 헤더를 제외한 바디 문자열이다. |
len | 0 이상의 값이어야 하며, 최대 읽어올 문자열의 길이이다. 이때 요청한 길이보다 바디가 짧게 남아 있는 경우에는 해당 길이보다 적게 읽어온다. |
예외 사항
예외 사항 | 설명 |
---|---|
BAD_ARGUMENT | GET_RESPONSE 함수를 선행하지 않고 해당 함수를 호출하거나, 파라미터를 잘못 사용하게 되는 경우 발생한다. |
END_OF_BODY | 바디 내용을 모두 읽었는데, 다시 한번 읽기 요청을 하게 되는 경우 발생한다. |
예제
단일 함수 사용의 예가 아니므로, “40.8. 예제”를 참고한다.
서버로 보낼 요청에 헤더를 설정한다. 여러번 반복 수행하여 추가적인 헤더 정보의 추가가 가능하다.
SET_HEADER 프러시저의 세부 내용은 다음과 같다.
프로토타입
PROCEDURE SET_HEADER ( r IN OUT NOCOPY req, name IN VARCHAR2, value IN VARCHAR2 );
파라미터
파라미터 | 설명 |
---|---|
r | 요청 식별자이다. |
name | 설정할 헤더 이름이다. |
value | 설정할 헤더의 값이다. |
예제
단일 함수 사용의 예가 아니므로, “40.8. 예제”를 참고한다.
현재 세션에 설정되어 있는 타임아웃 시간을 읽어온다. (기본 타임아웃 시간: 50초)
SET_TRANSFER_TIMEOUT 프러시저의 세부 내용은 다음과 같다.
프로토타입
PROCEDURE SET_TRANSFER_TIMEOUT ( timeout IN PLS_INTEGER );
예제
BEGIN utl_http.get_transfer_timeout(30); END;
서버로 보낼 요청의 바디를 설정한다.
프로토타입
PROCEDURE WRITE_TEXT ( r IN OUT NOCOPY REQ, data IN VARCHAR2 );
파라미터
파라미터 | 설명 |
---|---|
r | 요청 식별자이다. |
data | 요청 바디의 내용이다. |
예외 사항
예외 사항 | 설명 |
---|---|
BAD_ARGUMENT | BEGIN_REQUEST 또는 SET_HEADER를 선행하지 않고 해당 함수를 호출하거나, 파라미터를 잘못 사용하게 되는 경우 발생한다. |
END_OF_BODY | 바디 내용을 모두 읽었는데, 다시 한번 읽기 요청을 하게 되는 경우 발생한다. |
예제
단일 함수 사용의 예가 아니므로, “40.8. 예제”를 참고한다.
URL(Uniform Resource/ Locator)은 서버의 웹 페이지 주소를 나타내는 형태이며, 다음과 같은 형태로 구성된다.
scheme://[user[password]@]host[:port]/[...]
다음은 각 항목에 대한 설명이다.
항목 | 설명 |
---|---|
scheme | http와 https가 있으며, https는 다음에 구현할 예정이다. |
user | proxy를 위해 존재하며, 다음에 구현할 예정이다. |
password | proxy를 위해 존재하며, 다음에 구현할 예정이다. |
host | HTTP 서버 호스트 이름이다. |
port | 통신에 사용할 포트 번호이다. |
다음은 BEGIN_REQUEST, SET_HEADER, WRITE_TEXT, GET_RESPONSE, END_RESPONSE를 이용하여 ims.tmaxsoft.com의 로그인 웹 페이지의 html 스크립트를 읽어오는 예이다.
DECLARE req UTL_HTTP.REQ; resp UTL_HTTP.RESP; value VARCHAR2(1024); BEGIN req := UTL_HTTP.BEGIN_REQUEST('http://ims.tmaxsoft.com/tody/auth/login.do', 'POST', 'HTTP/1.1'); UTL_HTTP.SET_HEADER(req, 'User-Agent', 'Mozilla/4.0'); UTL_HTTP.WRITE_TEXT(req, 'test_value'); resp := UTL_HTTP.GET_RESPONSE(req); LOOP UTL_HTTP.READ_TEXT(resp, value); DBMS_OUTPUT.PUT_LINE ( value ); END LOOP; EXCEPTION WHEN UTL_HTTP.END_OF_BODY THEN UTL_HTTP.END_RESPONSE(resp); END;