제56장 UTL_HTTP

내용 목차

56.1. 개요
56.2. 상수
56.2.1. HTTP 버전 상수
56.2.2. HTTP 포트 상수
56.2.3. 상태 코드 상수
56.3. 타입
56.3.1. HTML_PIECES
56.3.2. req
56.3.3. resp
56.4. 예외
56.5. 함수
56.5.1. BEGIN_REQUEST
56.5.2. GET_RESPONSE
56.5.3. REQUEST
56.6. 프러시저
56.6.1. END_RESPONSE
56.6.2. GET_BODY_CHARSET
56.6.3. GET_DETAILED_EXCP_SUPPORT
56.6.4. GET_TRANSFER_TIMEOUT
56.6.5. READ_TEXT
56.6.6. SET_BODY_CHARSET
56.6.7. SET_DETAILED_EXCP_SUPPORT
56.6.8. SET_HEADER
56.6.9. SET_RESPONSE_ERROR_CHECK
56.6.10. SET_TRANSFER_TIMEOUT
56.6.11. WRITE_TEXT
56.7. URL
56.8. 예제

본 장에서는 HTTP/1.1을 기준으로 작성되었으며, UTL_HTTP 패키지의 기본 개념과 패키지 내의 함수를 사용하는 방법을 설명한다.

UTL_HTTP는 웹 표준(RFC2616)인 HTTP 프로토콜에 따라 클라이언트 역할을 제공하는 패키지이다.

프로토콜을 세부 조작하거나 간단히 웹 페이지만을 얻어올 수 있는 서브 프로그램을 제공한다.

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 패키지에서 제공하는 별도 정의된 타입들을 알파벳 순으로 설명한다.

다음은 UTL_HTTP 패키지에서 미리 제공된 예외이다. 자세한 내용은 “56.5. 함수”“56.6. 프러시저”의 "예외 사항" 항목을 참고한다.

  • BAD_ARGUMENT

  • END_OF_BODY

  • REQUEST_FAILED

본 절에서는 UTL_HTTP 패키지에서 제공하는 함수를 알파벳 순으로 설명한다.

HTTP 요청이나 HTTP 응답 메시지 바디의 문자 집합을 지정한다.

SET_BODY_CHARSET의 세부 내용은 다음과 같다.

  • CASE1

    HTTP 요청이나 HTTP 응답에 문자 집합(Character Set)을 지정하지 않는 경우 그리고 메시지 헤더에 Content-Type이 지정되지 않은 경우, 문자 집합을 지정할수 있다. 메시지 헤더에 Content-Type이 지정된 경우에는 무시된다. 세션 단위로 해당 정보의 설정이 가능하다.

    • 프로토타입

      PROCEDURE SET_BODY_CHARSET
      (
          charset    IN VARCHAR2 DEFAULT NULL
      );
    • 파라미터

      파라미터설명
      charset

      문자 집합(캐노니컬 문자 집합)의 이름이다. (기본값: 'ISO-8859-1')

      (예: ASCII, UTF-8, EUC-KR, CP949 ... 등)

  • CASE2

    HTTP 요청의 헤더에 Content-Type이 지정되지 않은 경우, 바디의 문자 집합을 지정한다. 문자열을 생략하는 경우, 'ISO-8859-1'로 간주된다. HTTP 요청 메시지 바디는 DB 문자 집합 문자열에서 지정된 문자열 집합의 문자열로 자동 변환된다. 메시지 헤더에 Content-Type이 지정된 경우에는 무시된다. 한번의 HTTP 요청에 대하여 설정 가능하다.

    • 프로토타입

      PROCEDURE SET_BODY_CHARSET
      (
          r          IN OUT NOCOPY req, 
          charset    IN VARCHAR2 DEFAULT NULL
      );
    • 파라미터

      파라미터설명
      charset

      문자 집합(캐노니컬 문자 집합)의 이름이다. (기본값: 'ISO-8859-1')

      (예: ASCII, UTF-8, EUC-KR, CP949 ... 등)

      reqHTTP 요청이다.
  • CASE3

    HTTP 응답의 헤더에 Content-Type이 지정되지 않은 경우, 바디의 문자열로 간주되는 문자열 집합을 지정한다. 문자열을 생략하는 경우, 'ISO-8859-1'로 간주된다. HTTP 응답 메시지 바디는 지정된 문자열 집합의 문자열에서 DB 문자 집합 문자열로 자동 변환된다. 메시지 헤더에 Content-Type이 지정된 경우에는 무시된다. 한번의 HTTP 응답에 대하여 설정 가능하다.

    • 프로토타입

      PROCEDURE SET_BODY_CHARSET
      (
          r          IN OUT NOCOPY resp, 
          charset    IN VARCHAR2 DEFAULT NULL
      );
    • 파라미터

      파라미터설명
      charset

      문자 집합(캐노니컬 문자 집합)의 이름이다. (기본값: 'ISO-8859-1')

      (예: ASCII, UTF-8, EUC-KR, CP949 ... 등)

      respHTTP 응답이다.
  • 예외 사항

    예외 사항설명
    BAD_ARGUMENT올바른 문자 집합 문자열을 넣지 않는 경우 발생한다.
  • 예제

    -- HTTP 요청과 응답의 바디 문자 집합을 UTF-8로 변경함 
    DECLARE
      req   UTL_HTTP.REQ;
      resp  UTL_HTTP.RESP;
      value varchar(32767);
    BEGIN
      req := UTL_HTTP.BEGIN_REQUEST('http://www.naver.com',
                                    'GET','HTTP/1.1');
      UTL_HTTP.SET_HEADER(req, 'User-Agent', 'Mozilla/4.0');
      UTL_HTTP.WRITE_TEXT(req, 'test_value');
      UTL_HTTP.SET_BODY_CHARSET(req, 'UTF-8');
      resp := UTL_HTTP.GET_RESPONSE(req);
      UTL_HTTP.SET_BODY_CHARSET(resp, 'UTF-8');
      FOR  i in 1 ..  200000
      LOOP
        UTL_HTTP.READ_TEXT(resp, value);
        DBMS_OUTPUT.PUT_LINE ( value );
      END LOOP;
        UTL_HTTP.END_RESPONSE(resp);
    exception when others then
        UTL_HTTP.END_RESPONSE(resp);
    end;
    /
    -- HTTP 요청과 응답에 대한 세션의 기본 문자 집합을 UTF-8로 변경함 
    BEGIN
        UTL_HTTP.SET_BODY_CHARSET('UTF-8');
    END;
    /

URL(Uniform Resource/ Locator)은 서버의 웹 페이지 주소를 나타내는 형태이며, 다음과 같은 형태로 구성된다.

scheme://[user[password]@]host[:port]/[...]

다음은 각 항목에 대한 설명이다.

항목설명
schemehttp와 https가 있으며, https는 다음에 구현할 예정이다.
userproxy를 위해 존재하며, 다음에 구현할 예정이다.
passwordproxy를 위해 존재하며, 다음에 구현할 예정이다.
hostHTTP 서버 호스트 이름이다.
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;
/