[php] PHP + curl, HTTP POST 샘플 코드?

누구든지 HTTP POST로 PHP curl을 수행하는 방법을 보여줄 수 있습니까?

다음과 같은 데이터를 보내려고합니다.

username=user1, password=passuser1, gender=1

www.domain.com

컬이와 같은 응답을 반환 할 것으로 기대합니다 result=OK. 예가 있습니까?



답변

<?php
//
// A very simple PHP example that sends a HTTP POST to a remote site
//

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL,"http://www.example.com/tester.phtml");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,
            "postvar1=value1&postvar2=value2&postvar3=value3");

// In real life you should use something like:
// curl_setopt($ch, CURLOPT_POSTFIELDS, 
//          http_build_query(array('postvar1' => 'value1')));

// Receive server response ...
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$server_output = curl_exec($ch);

curl_close ($ch);

// Further processing ...
if ($server_output == "OK") { ... } else { ... }
?>


답변

절차 적

// set post fields
$post = [
    'username' => 'user1',
    'password' => 'passuser1',
    'gender'   => 1,
];

$ch = curl_init('http://www.example.com');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);

// execute!
$response = curl_exec($ch);

// close the connection, release resources used
curl_close($ch);

// do anything you want with your response
var_dump($response);

객체 지향

<?php

// mutatis mutandis
namespace MyApp\Http;

class CurlPost
{
    private $url;
    private $options;

    /**
     * @param string $url     Request URL
     * @param array  $options cURL options
     */
    public function __construct($url, array $options = [])
    {
        $this->url = $url;
        $this->options = $options;
    }

    /**
     * Get the response
     * @return string
     * @throws \RuntimeException On cURL error
     */
    public function __invoke(array $post)
    {
        $ch = curl_init($this->url);

        foreach ($this->options as $key => $val) {
            curl_setopt($ch, $key, $val);
        }

        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $post);

        $response = curl_exec($ch);
        $error    = curl_error($ch);
        $errno    = curl_errno($ch);

        if (is_resource($ch)) {
            curl_close($ch);
        }

        if (0 !== $errno) {
            throw new \RuntimeException($error, $errno);
        }

        return $response;
    }
}

용법

// create curl object
$curl = new \MyApp\Http\CurlPost('http://www.example.com');

try {
    // execute the request
    echo $curl([
        'username' => 'user1',
        'password' => 'passuser1',
        'gender'   => 1,
    ]);
} catch (\RuntimeException $ex) {
    // catch errors
    die(sprintf('Http error %s with code %d', $ex->getMessage(), $ex->getCode()));
}

여기에서 참고 사항 : AdapterInterface예를 들어 getResponse()메소드로 호출되는 인터페이스를 작성하고 위의 클래스가 구현하도록하는 것이 가장 좋습니다 . 그런 다음 응용 프로그램에 아무런 부작용없이 항상이 구현을 원하는 다른 어댑터로 바꿀 수 있습니다.

HTTPS 사용 / 트래픽 암호화

일반적으로 Windows 운영 체제에서 PHP의 cURL에 문제가 있습니다. https로 보호 된 엔드 포인트에 연결하려고 할 때 오류 메시지가 표시 certificate verify failed됩니다.

대부분의 사람들이 여기서하는 일은 cURL 라이브러리에 단순히 인증서 오류를 무시하고 계속하도록 지시하는 것입니다 ( curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);). 이렇게하면 코드가 작동하므로 악의적 인 사용자가 Man In The Middle 공격 등과 같은 다양한 공격을 앱에서 수행 할 수 있습니다 .

절대로 그렇게하지 마십시오. 대신, 당신은 단순히 당신을 수정 php.ini하고 CA Certificate파일이 인증서를 올바르게 확인할 수 있도록 PHP 에게 알려 주면됩니다 :

; modify the absolute path to the cacert.pem file
curl.cainfo=c:\php\cacert.pem

cacert.pem인터넷에서 최신 버전 을 다운로드하거나 즐겨 찾는 브라우저에서 추출 할 수 있습니다 . php.ini관련 설정을 변경할 때는 웹 서버를 다시 시작해야합니다.


답변

php curl_exec를 사용하여 HTTP 게시를 수행하는 실제 예 :

이것을 foobar.php라는 파일에 넣으십시오.

<?php
  $ch = curl_init();
  $skipper = "luxury assault recreational vehicle";
  $fields = array( 'penguins'=>$skipper, 'bestpony'=>'rainbowdash');
  $postvars = '';
  foreach($fields as $key=>$value) {
    $postvars .= $key . "=" . $value . "&";
  }
  $url = "http://www.google.com";
  curl_setopt($ch,CURLOPT_URL,$url);
  curl_setopt($ch,CURLOPT_POST, 1);                //0 for a get request
  curl_setopt($ch,CURLOPT_POSTFIELDS,$postvars);
  curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch,CURLOPT_CONNECTTIMEOUT ,3);
  curl_setopt($ch,CURLOPT_TIMEOUT, 20);
  $response = curl_exec($ch);
  print "curl response is:" . $response;
  curl_close ($ch);
?>

그런 다음 명령으로 실행하면 php foobar.php이런 종류의 출력을 화면에 덤프합니다.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Title</title>

<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0">
<body>
  A mountain of content...
</body>
</html>

www.google.com에 PHP POST를 수행하여 데이터를 보냈습니다.

서버가 사후 변수를 읽도록 프로그래밍 된 경우,이를 기반으로 다른 작업을 수행 할 수 있습니다.


답변

다음과 같이 쉽게 도달 할 수 있습니다.

<?php

$post = [
    'username' => 'user1',
    'password' => 'passuser1',
    'gender'   => 1,
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://www.domain.com');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post));
$response = curl_exec($ch);
var_export($response);


답변

컬 포스트 + 오류 처리 + 헤더 설정 [@ mantas-d 덕분에] :

function curlPost($url, $data=NULL, $headers = NULL) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    if(!empty($data)){
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    }

    if (!empty($headers)) {
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    }

    $response = curl_exec($ch);

    if (curl_error($ch)) {
        trigger_error('Curl Error:' . curl_error($ch));
    }

    curl_close($ch);
    return $response;
}


curlPost('google.com', [
    'username' => 'admin',
    'password' => '12345',
]);


답변

curlPost('google.com', [
    'username' => 'admin',
    'password' => '12345',
]);


function curlPost($url, $data) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    $response = curl_exec($ch);
    $error = curl_error($ch);
    curl_close($ch);
    if ($error !== '') {
        throw new \Exception($error);
    }

    return $response;
}


답변

양식이 리디렉션, 인증, 쿠키, SSL (https) 또는 POST 변수를 예상하는 완전히 열린 스크립트 이외의 것을 사용하는 경우 치아를 빨리 gn 기 시작할 것입니다. Snoopy를 살펴보면 , 많은 오버 헤드를 설정할 필요없이 정확히 생각하고있는 것을 수행 할 수 있습니다.