개발 꿀팁/PHP

php에서 HTTP 요청 코드 시작

Jammie 2022. 11. 2. 13:21
반응형
<?php

Interface Proto
{
// 연결 url
public function conn($url)

// get 보내기
function get( )

// 포스트 보내기
function post( )

// 연결 닫기
function close( )
}

class Http implements Proto
{

const CRLF = "\r\n"; // http 표준 줄 바꿈
protected $line = array( );
protected $header = array( );
protected $body = array( );
protected $url = array( );
protected $version = 'HTTP/1.1';
protected $fh = null;
protected $errno = -1;
protected $errstr = '';
protected $res = '';
public function __construct($url)
{
$this->conn($url);
$this->setHeader('Host: ' . $this->url['host']);

}
// 요청 줄 복사하기
protected function setLine($method)
{
$this->line[0] = $method. ''' . $this->url['path'''?''. $this->url['query'''. '' . $this->version;
}
// 헤더 메시지
protected function setHeader($headerLine)
{
$this->header[] = $headerLine;
// 'HOST: .$this->url['host']
}
// 주체 정보 쓰기
protected function setBody($body)
{
$this->body = (http_build_query($body));
}
// 연결 url
public function conn($url)
{
$this->url = parse_url($url);
// 판단 포트
if (!isset($this->url['port']) {
$this->url['port'] = 80;
}

$this->fh = fsockopen($this->url['host'], $this->url['port'], $errno, $errstr, 3)
}

// get 요청 생성
public function get( )
{
$this->setLine('GET');
$this->request( );
return $this->res;
}

// post 요청 생성
public function post($body = array())
{
// 구조 주체 정보
$this->setLine('POST');

$this->setBody($body);

// content-type 설정
$this->setHeader('Content-type: application/x-www-form-urlencoded');
// content-length 계산
$this->setHeader('Content-length: '.strlen($this->body));


$this->request( );
// return $this->res;
}

// 청구를 발기
public function request( )
{
// 요청 줄, 헤더 정보, 엔티티 정보를 하나의 배열에 배치하면 연결하기 쉽다
$req = array_merge($this->line, $this->header, array('', array($this->body), array('))
$req = implode(self::CRLF, $req);
// echo $req;
fwrite($this->fh, $req)

// echo $req;
// exit;
while (!feof($this->fh)) {
// 1024 fh 한번 읽으면 끝이 안나와
$this->res.= fread($this->fh, 1024)
}
$this->close( );

}
// 연결 닫기
public function close( )
{
fclose($this->fh);
}
}

$url = 'http://localhost:8081/post.php';
$http = new Http($url);

$http->post(array('name'=>'mike', 'age'=>'18');
반응형