Program Tip

PHP로 POST 요청을 보내려면 어떻게합니까?

programtip 2020. 10. 2. 23:09
반응형

PHP로 POST 요청을 보내려면 어떻게합니까?


실제로는 검색어가 끝나면 검색 쿼리 뒤에 오는 내용을 읽고 싶습니다. 문제는 URL이 POST메소드 만 허용하고 메소드로 어떤 조치도 취하지 않는다는 것입니다 GET.

domdocument또는 의 도움으로 모든 내용을 읽어야합니다 file_get_contents(). POST메서드와 함께 매개 변수를 보낸 다음 내용을 읽을 수있는 방법이 PHP있습니까?


PHP5를 사용한 CURL-less 방법 :

$url = 'http://server.com/path';
$data = array('key1' => 'value1', 'key2' => 'value2');

// use key 'http' even if you send the request to https://...
$options = array(
    'http' => array(
        'header'  => "Content-type: application/x-www-form-urlencoded\r\n",
        'method'  => 'POST',
        'content' => http_build_query($data)
    )
);
$context  = stream_context_create($options);
$result = file_get_contents($url, false, $context);
if ($result === FALSE) { /* Handle error */ }

var_dump($result);

방법과 헤더 추가 방법에 대한 자세한 내용은 PHP 설명서를 참조하십시오. 예를 들면 다음과 같습니다.


cURL을 사용할 수 있습니다 .

<?php
//The url you wish to send the POST request to
$url = $file_name;

//The data you want to send via POST
$fields = [
    '__VIEWSTATE '      => $state,
    '__EVENTVALIDATION' => $valid,
    'btnSubmit'         => 'Submit'
];

//url-ify the data for the POST
$fields_string = http_build_query($fields);

//open connection
$ch = curl_init();

//set the url, number of POST vars, POST data
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_POST, true);
curl_setopt($ch,CURLOPT_POSTFIELDS, $fields_string);

//So that curl_exec returns the contents of the cURL; rather than echoing it
curl_setopt($ch,CURLOPT_RETURNTRANSFER, true); 

//execute post
$result = curl_exec($ch);
echo $result;
?>

다음 기능을 사용하여 curl을 사용하여 데이터를 게시합니다. $ data는 게시 할 필드의 배열입니다 (http_build_query를 사용하여 올바르게 인코딩 됨). 데이터는 application / x-www-form-urlencoded를 사용하여 인코딩됩니다.

function httpPost($url, $data)
{
    $curl = curl_init($url);
    curl_setopt($curl, CURLOPT_POST, true);
    curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data));
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    $response = curl_exec($curl);
    curl_close($curl);
    return $response;
}

@Edward는 curl이 CURLOPT_POSTFIELDS 매개 변수에 전달 된 배열을 올바르게 인코딩하므로 http_build_query가 생략 될 수 있다고 언급하지만이 경우 데이터는 multipart / form-data를 사용하여 인코딩됩니다.

이 함수는 application / x-www-form-urlencoded를 사용하여 데이터가 인코딩 될 것으로 예상하는 API와 함께 사용합니다. 그래서 http_build_query ()를 사용합니다.


완전한 단위 테스트를 거치고 최신 코딩 방식 을 사용하는 오픈 소스 패키지 guzzle 을 사용하는 것이 좋습니다 .

Guzzle 설치

프로젝트 폴더의 명령 줄로 이동하여 다음 명령을 입력합니다 (패키지 관리자 작성기 가 이미 설치되어 있다고 가정 ). Composer를 설치하는 방법에 대한 도움이 필요 하면 여기를 참조하십시오 .

php composer.phar require guzzlehttp/guzzle

Guzzle을 사용하여 POST 요청 보내기

Guzzle의 사용법은 가벼운 객체 지향 API를 사용하므로 매우 간단합니다.

// Initialize Guzzle client
$client = new GuzzleHttp\Client();

// Create a POST request
$response = $client->request(
    'POST',
    'http://example.org/',
    [
        'form_params' => [
            'key1' => 'value1',
            'key2' => 'value2'
        ]
    ]
);

// Parse the response object, e.g. read the headers, body, etc.
$headers = $response->getHeaders();
$body = $response->getBody();

// Output headers and body for debugging purposes
var_dump($headers, $body);

그렇게 할 경우 또 다른 CURL 방법이 있습니다.

다양한 플래그를 setopt () 호출과 결합하여 PHP curl 확장이 작동하는 방식을 살펴보면 이것은 매우 간단합니다. 이 예제에서는 보내려고 준비한 XML을 포함하는 $ xml 변수가 있습니다.이 내용을 예제의 테스트 메서드에 게시하겠습니다.

$url = 'http://api.example.com/services/xmlrpc/';
$ch = curl_init($url);

curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$response = curl_exec($ch);
curl_close($ch);
//process $response

먼저 연결을 초기화 한 다음 setopt ()를 사용하여 몇 가지 옵션을 설정합니다. 이것들은 우리가 post request를 만들고 있고 데이터를 제공하면서 데이터를 보내고 있다는 것을 PHP에 알려줍니다. CURLOPT_RETURNTRANSFER 플래그는 curl에게 출력을 출력하는 대신 curl_exec의 반환 값으로 출력을 제공하도록 지시합니다. 그런 다음 호출을하고 연결을 닫습니다. 결과는 $ response입니다.


혹시라도 Wordpress를 사용하여 앱을 개발하는 경우 (실제로는 매우 간단한 작업에 대해서도 권한 부여, 정보 페이지 등을 얻는 편리한 방법입니다) 다음 스 니펫을 사용할 수 있습니다.

$response = wp_remote_post( $url, array('body' => $parameters));

if ( is_wp_error( $response ) ) {
    // $response->get_error_message()
} else {
    // $response['body']
}

웹 서버에서 사용 가능한 항목에 따라 실제 HTTP 요청을 만드는 다른 방법을 사용합니다. 자세한 내용은 HTTP API 문서를 참조하십시오 .

Wordpress 엔진을 시작하기위한 사용자 지정 테마 또는 플러그인을 개발하지 않으려면 wordpress 루트의 격리 된 PHP 파일에서 다음을 수행하면됩니다.

require_once( dirname(__FILE__) . '/wp-load.php' );

// ... your code

테마를 표시하거나 HTML을 출력하지 않고 Wordpress API로 해킹하세요!


Fred Tanrikut의 컬 기반 답변에 대해 몇 가지 생각을 추가하고 싶습니다. 대부분은 이미 위의 답변에 기록되어 있지만 모두를 포함하는 답변을 보여주는 것이 좋은 생각이라고 생각합니다.

응답 본문과 관련하여 curl을 기반으로 HTTP-GET / POST / PUT / DELETE 요청을 작성하기 위해 작성한 클래스는 다음과 같습니다.

class HTTPRequester {
    /**
     * @description Make HTTP-GET call
     * @param       $url
     * @param       array $params
     * @return      HTTP-Response body or an empty string if the request fails or is empty
     */
    public static function HTTPGet($url, array $params) {
        $query = http_build_query($params); 
        $ch    = curl_init($url.'?'.$query);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HEADER, false);
        $response = curl_exec($ch);
        curl_close($ch);
        return $response;
    }
    /**
     * @description Make HTTP-POST call
     * @param       $url
     * @param       array $params
     * @return      HTTP-Response body or an empty string if the request fails or is empty
     */
    public static function HTTPPost($url, array $params) {
        $query = http_build_query($params);
        $ch    = curl_init();
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HEADER, false);
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $query);
        $response = curl_exec($ch);
        curl_close($ch);
        return $response;
    }
    /**
     * @description Make HTTP-PUT call
     * @param       $url
     * @param       array $params
     * @return      HTTP-Response body or an empty string if the request fails or is empty
     */
    public static function HTTPPut($url, array $params) {
        $query = \http_build_query($params);
        $ch    = \curl_init();
        \curl_setopt($ch, \CURLOPT_RETURNTRANSFER, true);
        \curl_setopt($ch, \CURLOPT_HEADER, false);
        \curl_setopt($ch, \CURLOPT_URL, $url);
        \curl_setopt($ch, \CURLOPT_CUSTOMREQUEST, 'PUT');
        \curl_setopt($ch, \CURLOPT_POSTFIELDS, $query);
        $response = \curl_exec($ch);
        \curl_close($ch);
        return $response;
    }
    /**
     * @category Make HTTP-DELETE call
     * @param    $url
     * @param    array $params
     * @return   HTTP-Response body or an empty string if the request fails or is empty
     */
    public static function HTTPDelete($url, array $params) {
        $query = \http_build_query($params);
        $ch    = \curl_init();
        \curl_setopt($ch, \CURLOPT_RETURNTRANSFER, true);
        \curl_setopt($ch, \CURLOPT_HEADER, false);
        \curl_setopt($ch, \CURLOPT_URL, $url);
        \curl_setopt($ch, \CURLOPT_CUSTOMREQUEST, 'DELETE');
        \curl_setopt($ch, \CURLOPT_POSTFIELDS, $query);
        $response = \curl_exec($ch);
        \curl_close($ch);
        return $response;
    }
}

개량

  • http_build_query를 사용하여 요청 배열에서 쿼리 문자열을 가져옵니다 (배열 자체를 사용할 수도 있으므로 http://php.net/manual/en/function.curl-setopt.php 참조 ).
  • Returning the response instead of echoing it. Btw you can avoid the returning by removing the line curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);. After that the return value is a boolean(true = request was successful otherwise an error occured) and the response is echoed. See: http://php.net/en/manual/function.curl-exec.php
  • Clean session closing and deletion of the curl-handler by using curl_close. See: http://php.net/manual/en/function.curl-close.php
  • Using boolean values for the curl_setopt function instead of using any number.(I know that any number not equal zero is also considered as true, but the usage of true generates a more readable code, but that's just my opinion)
  • Ability to make HTTP-PUT/DELETE calls(useful for RESTful service testing)

Example of usage

GET

$response = HTTPRequester::HTTPGet("http://localhost/service/foobar.php", array("getParam" => "foobar"));

POST

$response = HTTPRequester::HTTPPost("http://localhost/service/foobar.php", array("postParam" => "foobar"));

PUT

$response = HTTPRequester::HTTPPut("http://localhost/service/foobar.php", array("putParam" => "foobar"));

DELETE

$response = HTTPRequester::HTTPDelete("http://localhost/service/foobar.php", array("deleteParam" => "foobar"));

Testing

You can also make some cool service tests by using this simple class.

class HTTPRequesterCase extends TestCase {
    /**
     * @description test static method HTTPGet
     */
    public function testHTTPGet() {
        $requestArr = array("getLicenses" => 1);
        $url        = "http://localhost/project/req/licenseService.php";
        $this->assertEquals(HTTPRequester::HTTPGet($url, $requestArr), '[{"error":false,"val":["NONE","AGPL","GPLv3"]}]');
    }
    /**
     * @description test static method HTTPPost
     */
    public function testHTTPPost() {
        $requestArr = array("addPerson" => array("foo", "bar"));
        $url        = "http://localhost/project/req/personService.php";
        $this->assertEquals(HTTPRequester::HTTPPost($url, $requestArr), '[{"error":false}]');
    }
    /**
     * @description test static method HTTPPut
     */
    public function testHTTPPut() {
        $requestArr = array("updatePerson" => array("foo", "bar"));
        $url        = "http://localhost/project/req/personService.php";
        $this->assertEquals(HTTPRequester::HTTPPut($url, $requestArr), '[{"error":false}]');
    }
    /**
     * @description test static method HTTPDelete
     */
    public function testHTTPDelete() {
        $requestArr = array("deletePerson" => array("foo", "bar"));
        $url        = "http://localhost/project/req/personService.php";
        $this->assertEquals(HTTPRequester::HTTPDelete($url, $requestArr), '[{"error":false}]');
    }
}

Another alternative of the curl-less method above is to use the native stream functions:

  • stream_context_create():

    Creates and returns a stream context with any options supplied in options preset.

  • stream_get_contents():

    Identical to file_get_contents(), except that stream_get_contents() operates on an already open stream resource and returns the remaining contents in a string, up to maxlength bytes and starting at the specified offset.

A POST function with these can simply be like this:

<?php

function post_request($url, array $params) {
  $query_content = http_build_query($params);
  $fp = fopen($url, 'r', FALSE, // do not use_include_path
    stream_context_create([
    'http' => [
      'header'  => [ // header array does not need '\r\n'
        'Content-type: application/x-www-form-urlencoded',
        'Content-Length: ' . strlen($query_content)
      ],
      'method'  => 'POST',
      'content' => $query_content
    ]
  ]));
  if ($fp === FALSE) {
    fclose($fp);
    return json_encode(['error' => 'Failed to get contents...']);
  }
  $result = stream_get_contents($fp); // no maxlength/offset
  fclose($fp);
  return $result;
}

There is one more which you can use

<?php
$fields = array(
    'name' => 'mike',
    'pass' => 'se_ret'
);
$files = array(
    array(
        'name' => 'uimg',
        'type' => 'image/jpeg',
        'file' => './profile.jpg',
    )
);

$response = http_post_fields("http://www.example.com/", $fields, $files);
?>

Click here for details


I was looking for a similar problem and found a better approach of doing this. So here it goes.

You can simply put the following line on the redirection page (say page1.php).

header("Location: URL", TRUE, 307); // Replace URL with to be redirected URL, e.g. final.php

I need this to redirect POST requests for REST API calls. This solution is able to redirect with post data as well as custom header values.

Here is the reference link.


The better way of sending GET or POST requests with PHP is as below:

<?php
    $r = new HttpRequest('http://example.com/form.php', HttpRequest::METH_POST);
    $r->setOptions(array('cookies' => array('lang' => 'de')));
    $r->addPostFields(array('user' => 'mike', 'pass' => 's3c|r3t'));

    try {
        echo $r->send()->getBody();
    } catch (HttpException $ex) {
        echo $ex;
    }
?>

The code is taken from official documentation here http://docs.php.net/manual/da/httprequest.send.php


Try PEAR's HTTP_Request2 package to easily send POST requests. Alternatively, you can use PHP's curl functions or use a PHP stream context.

HTTP_Request2 also makes it possible to mock out the server, so you can unit-test your code easily


Here is using just one command without cURL. Super simple.

echo file_get_contents('https://www.server.com', false, stream_context_create([
    'http' => [
        'method' => 'POST',
        'header'  => "Content-type: application/x-www-form-urlencoded",
        'content' => http_build_query([
            'key1' => 'Hello world!'
        ])
    ]
]));

참고URL : https://stackoverflow.com/questions/5647461/how-do-i-send-a-post-request-with-php

반응형