Làm cách nào để gửi yêu cầu POST với PHP?


653

Thật ra tôi muốn đọc nội dung xuất hiện sau truy vấn tìm kiếm, khi nó được thực hiện. Vấn đề là URL chỉ chấp nhậnPOST các phương thức và nó không thực hiện bất kỳ hành động nào với GETphương thức ...

Tôi phải đọc tất cả nội dung với sự giúp đỡ của domdocumenthoặc file_get_contents(). Có phương pháp nào cho phép tôi gửi tham số với POSTphương thức và sau đó đọc nội dung qua PHPkhông?

Câu trả lời:


1256

Phương pháp không có CURL với PHP5:

$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);

Xem hướng dẫn sử dụng PHP để biết thêm thông tin về phương pháp và cách thêm tiêu đề, ví dụ:


64
Điều đáng chú ý là nếu bạn quyết định sử dụng một mảng cho các tiêu đề, KHÔNG kết thúc các khóa hoặc giá trị bằng '\ r \ n'. stream_context_create () sẽ chỉ đưa văn bản lên đến '\ r \ n' đầu tiên
raptor

11
Một URL có thể được sử dụng làm tên tệp file_get_contents()chỉ khi trình bao bọc fopen đã được bật. Xem php.net/manual/en/ Kẻ
Pino

3
@ Tôi yêufile_get_contents()
bế tắc

14
Có một lý do cụ thể cho việc không sử dụng CURL?
jvannistelrooy

37
@jvannistelrooy CURL cho PHP là một phần mở rộng có thể không tồn tại trong tất cả các môi trường trong khi đó file_get_contents()là một phần cốt lõi của PHP. Ngoài ra, sử dụng tiện ích mở rộng không cần thiết có thể mở rộng bề mặt tấn công của ứng dụng của bạn. Ví dụ: Google php curl cve
Pocketsand

137

Bạn có thể sử dụng 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;
?>

3
cái này hoạt động với tôi vì trang tôi đang gửi đến một trang không có nội dung nên phiên bản file_get_contents không hoạt động.
luậnLuv

8
giải pháp file_get_contents không hoạt động trên các cấu hình PHP với allow_url_fopen Tắt (như trong lưu trữ chia sẻ). Phiên bản này sử dụng thư viện curl và tôi nghĩ là "phổ quát" nhất vì vậy tôi cho bạn phiếu bầu của tôi
Dayron Gallardo

81
Bạn đã không trang web nơi bạn đã sao chép mẫu mã này từ: davidwalsh.name/curl-post
efreed

4
Mặc dù nó không quan trọng lắm, nhưng dữ liệu tham số CURLOPT_POSTFIELDS thực sự không cần phải chuyển đổi thành một chuỗi ("urlified"). Trích dẫn: "Tham số này có thể được truyền dưới dạng chuỗi urlencoding như 'para1 = val1 & para2 = val2 & ...' hoặc dưới dạng một mảng với tên trường là khóa và dữ liệu trường dưới dạng giá trị. Nếu giá trị là một mảng, Kiểu nội dung tiêu đề sẽ được đặt thành nhiều dữ liệu / biểu mẫu dữ liệu. " Liên kết: php.net/manual/en/feft.curl-setopt.php .
Edward

2
Ngoài ra, không có ý xúc phạm khi viết nó khác nhau, nhưng tôi không biết tại sao tham số CURLOPT_POST được chỉ định là một số ở đây như đã nói để đặt nó thành boolean trên trang thủ công. Trích dẫn: "CURLOPT_POST: TRUE để thực hiện POST HTTP thông thường." Liên kết: php.net/manual/en/feft.curl-setopt.php .
Edward

67

Tôi sử dụng chức năng sau đây để đăng dữ liệu bằng cách sử dụng curl. $ data là một mảng các trường để đăng (sẽ được mã hóa chính xác bằng http_build_query). Dữ liệu được mã hóa bằng application / x-www-form-urlencoding.

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 đề cập rằng http_build_query có thể bị bỏ qua vì curl sẽ mã hóa chính xác mảng được truyền cho tham số CURLOPT_POSTFIELDS, nhưng trong trường hợp này, dữ liệu sẽ được mã hóa bằng dữ liệu đa dữ liệu / biểu mẫu.

Tôi sử dụng chức năng này với các API dự kiến ​​dữ liệu sẽ được mã hóa bằng application / x-www-form-urlencoding. Đó là lý do tại sao tôi sử dụng http_build_query ().


Truyền mảng tới CURLOPT_POSTFIELDS khiến dữ liệu được mã hóa bằng cách sử dụng dữ liệu đa dữ liệu / biểu mẫu có thể không mong muốn.
Dima L.

Người dùng đã yêu cầu file_get_contents, vì vậy anh ta cần một giải pháp để thay đổi default_stream_context
Radon8472

Để làm rõ: Tôi nghĩ @DimaL. đang trả lời một bình luận đã bị xóa; http_build_querychuyển đổi $datamảng thành một chuỗi, tránh đầu ra dưới dạng nhiều dữ liệu / biểu mẫu.
ToolmakerSteve

@ Radon8472 - ... CURLOPT_RETURNTRANSFER, truekết quả trong việc $responsechứa nội dung.
ToolmakerSteve

@ToolmakerSteve như tôi đã nói, câu hỏi được đặt ra file_get_contentsvà giải pháp của bạn cần HIỆN TẠI mà nhiều người không có. vì vậy giải pháp của bạn có thể đang hoạt động, nhưng nó không trả lời câu hỏi làm thế nào để thực hiện điều này với các hàm tập tin / luồng dựng sẵn.
Radon8472

41

Tôi khuyên bạn nên sử dụng gói gạc nguồn mở đó là hoàn toàn đơn vị thử nghiệm và sử dụng mới nhất thực hiện mã hóa.

Cài đặt Guheads

Đi đến dòng lệnh trong thư mục dự án của bạn và nhập lệnh sau (giả sử bạn đã cài đặt trình soạn thảo trình quản lý gói ). Nếu bạn cần trợ giúp làm thế nào để cài đặt Trình soạn thảo, bạn nên xem tại đây .

php composer.phar require guzzlehttp/guzzle

Sử dụng Guheads để gửi yêu cầu POST

Việc sử dụng Guheads rất đơn giản vì nó sử dụng API hướng đối tượng trọng lượng nhẹ:

// 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);

7
Sẽ rất hữu ích khi biết những lợi thế này có gì so với giải pháp PHP gốc đã được đăng và cả cURL nữa.
artfulrobot

9
@artfulrobot: Giải pháp PHP gốc có rất nhiều vấn đề (ví dụ: kết nối với https, xác minh chứng chỉ, v.v.), đó là lý do tại sao hầu hết mọi nhà phát triển PHP đều sử dụng cURL. Và tại sao không sử dụng cURL trong trường hợp này? Thật đơn giản: Guheads có giao diện đơn giản, dễ dàng, trọng lượng nhẹ, trừu tượng hóa tất cả những "vấn đề xử lý cURL cấp thấp". Hầu như tất cả mọi người phát triển PHP hiện đại đều sử dụng Trình soạn thảo, vì vậy sử dụng Guheads chỉ thực sự đơn giản.
Andreas

2
Cảm ơn, tôi biết ách rất phổ biến, tuy nhiên có những trường hợp sử dụng khi nhà soạn nhạc gây đau buồn (ví dụ: phát triển bổ trợ cho các dự án phần mềm lớn hơn có thể đã sử dụng (phiên bản khác) của gạc hoặc các phụ thuộc khác), vì vậy thật tốt khi biết thông tin này để thực hiện một quyết định về giải pháp nào sẽ mạnh mẽ nhất
artfulrobot

25

Có một phương pháp CURL khác nếu bạn đang đi theo cách đó.

Điều này khá đơn giản một khi bạn hiểu được cách hoạt động của tiện ích mở rộng curl PHP, kết hợp nhiều cờ khác nhau với các lệnh gọi setopt (). Trong ví dụ này, tôi đã có một biến $ xml chứa XML mà tôi đã chuẩn bị gửi - Tôi sẽ đăng nội dung của phương thức đó lên phương thức thử nghiệm của ví dụ.

$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

Đầu tiên chúng tôi khởi tạo kết nối, sau đó chúng tôi đặt một số tùy chọn bằng cách sử dụng setopt (). Chúng cho PHP biết rằng chúng tôi đang thực hiện một yêu cầu bài đăng và rằng chúng tôi đang gửi một số dữ liệu với nó, cung cấp dữ liệu. Cờ CURLOPT_RETURNTRANSFER báo cho curl cung cấp cho chúng ta đầu ra dưới dạng giá trị trả về của curl_exec thay vì xuất ra nó. Sau đó, chúng tôi thực hiện cuộc gọi và đóng kết nối - kết quả là trong phản hồi $.


1
trong lệnh gọi curl_setopt () thứ 3, đối số đầu tiên có nên $chkhông $curl, đúng không?
jcomeau_ictx

Bạn có thể sử dụng cùng mã này để POST dữ liệu JSON không? Nhưng thay thế $ xml bằng nói $ json (trong đó $ json có lẽ là một chuỗi JSON?)
Neal Davis

23

Nếu bạn có thể đang sử dụng Wordpress để phát triển ứng dụng của mình (đây thực sự là một cách thuận tiện để nhận ủy quyền, trang thông tin, v.v. ngay cả đối với những thứ rất đơn giản), bạn có thể sử dụng đoạn mã sau:

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

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

Nó sử dụng các cách khác nhau để thực hiện yêu cầu HTTP thực tế, tùy thuộc vào những gì có sẵn trên máy chủ web. Để biết thêm chi tiết, xem tài liệu API HTTP .

Nếu bạn không muốn phát triển một chủ đề hoặc plugin tùy chỉnh để khởi động công cụ Wordpress, bạn chỉ có thể thực hiện các thao tác sau trong tệp PHP bị cô lập trong thư mục gốc wordpress:

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

// ... your code

Nó sẽ không hiển thị bất kỳ chủ đề hoặc xuất bất kỳ HTML nào, chỉ cần hack đi các API Wordpress!


21

Tôi muốn thêm một vài suy nghĩ về câu trả lời dựa trên curl của Fred Tanrikut. Tôi biết hầu hết trong số chúng đã được viết trong các câu trả lời ở trên, nhưng tôi nghĩ rằng đó là một ý tưởng tốt để hiển thị một câu trả lời bao gồm tất cả chúng cùng nhau.

Đây là lớp tôi đã viết để thực hiện các yêu cầu HTTP-GET / POST / PUT / DELETE dựa trên curl, liên quan đến phần thân phản hồi:

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;
    }
}

Cải tiến

  • Sử dụng http_build_query để đưa chuỗi truy vấn ra khỏi mảng yêu cầu. (Bạn cũng có thể sử dụng chính mảng đó, do đó, hãy xem: http://php.net/manual/en/feft.curl-setopt.php )
  • Trả lại phản hồi thay vì lặp lại nó. Btw bạn có thể tránh việc quay lại bằng cách xóa dòng curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, true); . Sau đó, giá trị trả về là boolean (true = request đã thành công nếu không xảy ra lỗi) và phản hồi được lặp lại. Xem: http://php.net/en/manual/feft.curl-exec.php
  • Làm sạch đóng phiên và xóa trình xử lý curl bằng cách sử dụng curl_c Đóng . Xem: http://php.net/manual/en/feft.curl-close.php
  • Sử dụng các giá trị boolean cho curl_setopt hàm thay vì sử dụng bất kỳ số nào. (Tôi biết rằng bất kỳ số nào không bằng 0 cũng được coi là đúng, nhưng việc sử dụng true tạo ra một mã dễ đọc hơn, nhưng đó chỉ là ý kiến ​​của tôi)
  • Khả năng thực hiện các cuộc gọi HTTP-PUT / DELETE (hữu ích cho thử nghiệm dịch vụ RESTful)

Ví dụ về cách sử dụng

ĐƯỢC

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

BÀI ĐĂNG

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

ĐẶT

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

XÓA BỎ

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

Kiểm tra

Bạn cũng có thể thực hiện một số thử nghiệm dịch vụ thú vị bằng cách sử dụng lớp đơn giản này.

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}]');
    }
}

Đối với tôi, nó nói "Lỗi chưa được mã hóa: Gọi đến phương thức không xác định HTTPRequester :: HTTPost ()" . Tôi chỉ đơn giản là dán lớp của bạn vào tập tin .php của tôi. Bất cứ điều gì khác tôi cần phải làm?
LinusGeffarth

1
Bạn có thể vui lòng gửi mã của bạn? Thật khó để đoán những gì sai mà không có đoạn mã nào.
mwatzer

Như tôi đã nói, tôi thực sự đã sao chép tệp của bạn vào tệp php đơn giản của mình và nó đã gây ra lỗi này.
LinusGeffarth

1
Ok bây giờ tôi thấy vấn đề, .. nó đã sai trong ví dụ! Bạn phải gọi HTTPRequester :: HTTPPost () thay vì HTTPRequester :: HTTPost ()
mwatzer

1
Ah. Đó là một trong những dễ dàng để bỏ lỡ. Tôi đã đọc được nhận xét của bạn như 5x trước khi tôi phát hiện thêm các P . Cảm ơn!
LinusGeffarth

19

Một cách khác của phương pháp curl-less ở trên là sử dụng các hàm luồng gốc :

  • stream_context_create():

    Tạo và trả về bối cảnh luồng với bất kỳ tùy chọn nào được cung cấp trong các tùy chọn đặt trước.

  • stream_get_contents():

    Giống file_get_contents(), ngoại trừ stream_get_contents() hoạt động trên một dòng suối đã được mở tài nguyên và trả về các nội dung còn lại trong một chuỗi, lên đến maxlength byte và bắt đầu từ quy định bù đắp .

Một hàm POST với những thứ này có thể đơn giản như thế này:

<?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) {
    return json_encode(['error' => 'Failed to get contents...']);
  }
  $result = stream_get_contents($fp); // no maxlength/offset
  fclose($fp);
  return $result;
}

1
Phương pháp không có CURL này hoạt động tốt đối với tôi để xác thực reCAPTCHA từ google. Câu trả lời này hội tụ với mã google này: github.com/google/recaptcha/blob/master/src/ReCaptcha/ Kẻ
Xavi Montero

1
Bạn không phải sử dụng fclose()nếu $fpfalse. Bởi vì fclose()mong đợi một tài nguyên là tham số.
Floris

1
@Floris Đã chỉnh sửa nó ngay bây giờ và thực sự các tài liệu fclose đề cập "Con trỏ tệp phải hợp lệ". Cảm ơn bạn đã nhận thấy điều đó!
CPHPython

8

Cách tốt hơn để gửi GEThoặc POSTyêu cầu PHPnhư sau:

<?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;
    }
?>

Mã được lấy từ tài liệu chính thức tại đây http://docs.php.net/manual/da/httprequest.send.php


1
@akinuri cảm ơn vì đã làm nổi bật, tôi sẽ chia sẻ cái mới.
Imran Zahoor

Làm thế nào để làm điều đó trên PHP 5x?

@YumYumYum vui lòng kiểm tra câu trả lời dbau ở trên cho 5x sử dụng kỹ thuật này php.net/manual/en/feft.stream-context-create.php Hoặc bạn luôn có thể quay lại giải pháp curl tiêu chuẩn.
Imran Zahoor

5

Có một cái nữa mà bạn có thể sử dụng

<?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);
?>

Nhấn vào đây để biết thêm chi tiết


2
Điều này phụ thuộc vào tiện ích mở rộng PECL mà hầu hết sẽ không được cài đặt. Thậm chí không chắc chắn nó vẫn có sẵn, vì các trang hướng dẫn đã bị xóa.
miken32

5

Tôi đã tìm kiếm một vấn đề tương tự và tìm thấy một cách tiếp cận tốt hơn để làm điều này. Vì vậy, ở đây nó đi.

Bạn có thể chỉ cần đặt dòng sau vào trang chuyển hướng (giả sử page1.php).

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

Tôi cần điều này để chuyển hướng các yêu cầu POST cho các cuộc gọi API REST . Giải pháp này có thể chuyển hướng với dữ liệu bài đăng cũng như các giá trị tiêu đề tùy chỉnh.

Đây là liên kết tham khảo .


1
Câu trả lời này làm thế nào để chuyển hướng một yêu cầu trang không phải làm cách nào để gửi yêu cầu POST với PHP? Chắc chắn điều này sẽ chuyển tiếp bất kỳ tham số POST nào nhưng điều đó hoàn toàn không giống nhau
Wesley Smith

@ DelightedD0D, Xin lỗi tôi đã không nhận được sự khác biệt giữa redirect a page request with POST paramvs send POST request. Đối với tôi mục đích của cả hai là như nhau, sửa tôi nếu tôi sai.
Arindam Nayak

1
Có phương pháp nào cho phép tôi gửi tham số bằng phương thức POST và sau đó đọc nội dung qua PHP không? OP muốn tập lệnh php của họ xây dựng một tập các tham số POST và gửi chúng đến một trang php khác và để tập lệnh của họ nhận đầu ra từ trang đó. Giải pháp này chỉ đơn giản là chấp nhận một bộ giá trị đã được POST và chuyển chúng sang trang khác. Họ khá khác nhau.
Wesley Smith

5

Ở đây chỉ sử dụng một lệnh mà không có cURL. Siêu đơn giản.

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!', 'key2' => 'second value'
        ])
    ]
]));

Key2 sẽ hoạt động như thế nào? những gì ngăn cách giữa họ?
Muhammad đã nói

@Sayedidrees để thêm key2, bạn có thể nhập nó dưới dạng một mục mảng thứ hai. 'key1' => 'Xin chào thế giới!', 'key2' => 'giá trị thứ hai'
Liga

Điều này hoạt động rất tốt trong khi sử dụng với zapier.
Moxet

3

Hãy thử gói HTTP_Request2 của PEAR để dễ dàng gửi các yêu cầu POST. Ngoài ra, bạn có thể sử dụng các hàm curl của PHP hoặc sử dụng bối cảnh luồng PHP .

HTTP_Request2 cũng cho phép giả lập máy chủ , do đó bạn có thể kiểm tra đơn vị mã của mình một cách dễ dàng


7
Tôi muốn thấy bạn xây dựng nó, nếu có thể.
Gui Imamura
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.