CURLRequest 라이브러리는 서버와 통신할 수있는 CURL 기반의 경량 HTTP 클라이언트입니다.
가장 널리 사용되는 Guzzle HTTP Client 라이브러리의 인터페이스를 모델로 합니다.
인터페이스가 Guzzle 구문과 동일하게 유지되므로, 이 라이브러리를 대신 Guzzle로 바꾸어도 거의 변경없이 사용 가능합니다.

라이브러리 로드

// 서비스 클래스를 통해 로드
$client1  = \Config\Services::curlrequest();

// service() 헬퍼를 통해 로드
$client2 = service('curlrequest');

// cURL 요청 처리 방법을 수정하기 위해 옵션 배열을 첫 번째 매개 변수로 전달할 수 있습니다.
$client3 = \Config\Services::curlrequest([
    'baseURI' => 'http://google.co.kr',
    'timeout' => 3,
]);

요청 만들기

CURL 요청 작업은 `request` 객체를 작성하여 요청을 처리하고 `response` 객체를 받습니다.

대부분의 통신은 `request()` 메소드를 통해 이루어집니다.
이 메소드는 요청 결과를 `Response` 인스턴스로 반환합니다.

$response = $client->request('GET', 'https://www.google.com/search', ['q' => 'codeigniter']);

각 HTTP 요청에 대한 단축 메소드도 제공합니다.

$client->get('http://example.com');
$client->delete('http://example.com');
$client->head('http://example.com');
$client->options('http://example.com');
$client->patch('http://example.com');
$client->put('http://example.com');
$client->post('http://example.com');

Response 객체 사용

각 request() 호출은 유용한 정보와 메소드를 포함하는 `response` 객체를 반환합니다.

getStatusCode()

서버의 상태를 확인할 수 있습니다.

echo $response->getStatusCode(); // 302
echo $response->getHeader('Content-Type'); // Content-Type:  text/html; charset=UTF-8

getHeaderLine()

응답에서 헤더를 검색할 수 있습니다

echo $response->getHeaderLine('Content-Type'); //  text/html; charset=UTF-8

getHeaders()

헤더를 통해 전달되는 모든 데이터를 반환합니다.

foreach ($response->getHeaders() as $name => $value) {
    echo $name .': '. $response->getHeaderLine($name) ."\n";
}
Cache-control: no-store, max-age=0, no-cache,  private
Content-Type:  text/html; charset=UTF-8
Location:  https://www.google.com/webhp
Content-Security-Policy:  object-src 'none';base-uri 'self';script-src 'nonce-gyPfgVrRfaWmWDX7qgzWXQ' 'strict-dynamic' 'report-sample' 'unsafe-eval' 'unsafe-inline' https: http:;report-uri https://csp.withgoogle.com/csp/gws/xsrp
P3P:  CP="This is not a P3P policy! See g.co/p3phelp for more info."
Date:  Thu, 28 Mar 2024 10:40:45 GMT
Server:  gws
Content-Length:  225
X-XSS-Protection:  0
X-Frame-Options:  SAMEORIGIN
Set-Cookie:  NID=512=NuRYIskKGqafVdNRpE-2R2fKlR5dk5AQTnBEItBjHbj12nRbv3ODc_3GBRMcfTQZMG8BoZSJ39-LOzrxKH3P_KEJ4oIppSXJNYViar5KfTxiUYX0rL2YKLpxE5TEO9j7NYVWQXtcf6chbOm5ksHd6c3k7sKR461ywRh-FdsUk_g; expires=Fri, 27-Sep-2024 10:40:45 GMT; path=/; domain=.google.com; HttpOnly
Alt-Svc:  h3=":443"; ma=2592000,h3-29=":443"; ma=2592000

getBody()

HTML 본문을 반환 합니다.

echo $response->getBody();
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="https://www.google.com/webhp">here</A>.
</BODY></HTML>

Request 옵션

request() 메소드에 전달할 수 있는 모든 옵션에 대해 설명합니다.

allow_redirects

`Location` 헤더에 따른 리디렉션 처리 방법을 설정합니다.(`true` or `false`);

// false로 설정하면 리디렉션 처리하지 않습니다.
$client->request('GET', 'http://example.com', ['allow_redirects' => false]);

// true로 설정하면 리디렉션 처리 합니다.
$client->request('GET', 'http://example.com', ['allow_redirects' => true]);

auth

HTTP Basic과 Digest 인증에 대한 인증 정보를 제공합니다.

// HTTP Basic 인증 정보 설정
$client->request('GET', 'http://example.com', ['auth' => ['username', 'password', 'basic']]);

// Digest 인증 인증 정보 설정
$client->request('GET', 'http://example.com', ['auth' => ['username', 'password', 'digest']]);

body

PUT, POST, DELETE, PATCH 요청에 대한 요청 본문을 설정합니다.

$body = json_encode(['username' => 'username', 'password' => 'password']);

// 요청 본문을 설정(Guzzle API 호환)
$client->request('PUT', 'http://example.com', ['body' => $body]);

// setBody() 메소드 사용하여 설정
$client->setBody($body)->request('PUT', 'http://example.com');

cert

PEM 형식의 클라이언트측 인증서를 설정합니다.

// 인증서 파일의 경로는 절대경로로 지정합니다.
$client->request('GET', 'http://example.com', ['cert' => ['/path/getServer.pem']);

// 인증서 사용시 비밀번호 사용
$client->request('GET', 'http://example.com', ['cert' => ['/path/getServer.pem', 'password']);

connect_timeout

웹 사이트 연결 시도 제한 시간을 초 단위로 설정합니다.

// 제한 시간 2분
$response->request('GET', 'http://example.com', ['connect_timeout' => 120]);

// 제한 시간 없음
$response->request('GET', 'http://example.com', ['connect_timeout' => 0]);

cookie

웹 사이트의 쿠키를 읽고, 저장할 때 사용할 파일 이름을 설정합니다.

// 쿠키 파일의 경로는 절대 경로로 지정합니다.
$response->request('GET', 'http://example.com', ['cookie' => WRITEPATH . 'CookieSaver.txt']);

debug

디버깅 내용을 STDOUT으로 출력 여부를 설정합니다.

// 디버깅 내용을 STDOUT으로 출력
$response->request('GET', 'http://example.com', ['debug' => true]);

// 디버깅 내용을 서버 오류 로그에 기록
$response->request('GET', 'http://example.com', ['debug' => false]);

// 디버깅 내용을 `/usr/local/curl_log.txt`에 기록
$response->request('GET', 'http://example.com', ['debug' => '/usr/local/curl_log.txt']);

delay

설정시 요청을 보내기 전에 일시 중지할 수 있습니다.

// 2초 일시 정지
$response->request('GET', 'http://example.com', ['delay' => 2000]);

form_params

POST 요청에 대해 `application/x-www-form-urlencoded` 방식으로 폼(form) 데이터를 보냅니다.

$client->request('POST', 'http://example.com', [
        'form_params' => [
                'foo' => 'bar',
                'baz' => ['hi', 'there'],
        ],
]);

headers

요청에 필요한 헤더를 설정합니다.

$client->request('POST', 'http://example.com', [
        'headers' => [
                'User-Agent' => 'testing/1.0',
                'Accept'     => 'application/json',
                'X-Foo'      => ['Bar', 'Baz'],
        ],
]);

http_errors

오류 내용을 반환 여부를 설정합니다.

// HTTP 코드가 400 이상이면 오류를 내고 프로그램을 멈춥니다.
$client->request('GET', 'http://example.com');

// 오류 내용을 반환합니다.
$res = $client->request('GET', 'http://example.com', ['http_errors' => false]);
echo $res->getStatusCode(); // 500

json

요청 본문을 JSON으로 인코딩하여 전송합니다.

$response = $client->request('PUT', 'http://example.com', ['json' => ['foo' => 'bar']]);

multipart

`CURLFile` 인스턴스로 전달된 파일을 POST 요청을 통해 업로드합니다.
`multipart`는 `form_params` 옵션과 함께 사용할 수 없습니다.

$response = $client->request('POST', 'http://example.com/upload', [
        'foo'      => 'bar',
        'userfile' => new \CURLFile('/path/to/file.txt'),
]);

query

GET과 함께 전송할 쿼리 문자열을 설정합니다.

$response = $client->request('GET', 'http://example.com/upload', ['query' => ['foo' => 'bar']]);

timeout

서버의 응답 대기 시간을 설정합니다.

// 대기 시간을 2분으로 제한
$response->request('GET', 'http://example.com', ['timeout' => 120]);

// 무기한 대기
$response->request('GET', 'http://example.com', ['timeout' => 0]);

user_agent

USER_AGENT를 설정합니다.

$response->request('GET', 'http://example.com', ['user_agent' => 'CodeIgniter Framework v4']);

verify

SSL 인증서 확인 여부를 설정합니다.

//  SSL 인증서 확인
$client->request('GET', 'http://example.com', ['verify' => true]);

// SSL 인증서 확인 안함
$client->request('GET', 'http://example.com', ['verify' => false]);

// SSL 이증시 사용할 인증서 지정
$client->request('GET', 'http://example.com', ['verify' => '/path/to/cert.pem']);

version

HTTP 프로토콜 버전을 설정합니다.(일반적으로 1.0, 1.1, 2.0)

// HTTP/1.0으로 설정
$client->request('GET', 'http://example.com', ['version' => 1.0]);