如何使用PHP发送POST请求?

其实我想读取search查询后的内容。 问题是这个URL只接受POST方法,并且不会对GET方法进行任何操作。

我必须在domdocumentfile_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手册,例如:

  • stream_context_create : http : //php.net/manual/en/function.stream-context-create.php

我确实尝试过这一个,它工作正常…因为我rquired ..

 <?php $url = $file_name; $fields = array( '__VIEWSTATE'=>urlencode($state), '__EVENTVALIDATION'=>urlencode($valid), 'btnSubmit'=>urlencode('Submit') ); //url-ify the data for the POST foreach($fields as $key=>$value) { $fields_string .= $key.'='.$value.'&'; } $fields_string = rtrim($fields_string,'&'); //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,count($fields)); curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string); //execute post $result = curl_exec($ch); print $result; ?> 

我使用下面的函数来使用curl发布数据:

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

我build议您使用完全经过unit testing的开放源代码包,并使用最新的编码实践。

安装Guzzle

转到项目文件夹中的命令行并键入以下命令(假定您已经安装了包pipe理器编辑器)。 如果你需要帮助如何安装composer php, 你应该看看这里 。

 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, eg read the headers, body, etc. $headers = $response->getHeaders(); $body = $response->getBody(); // Output headers and body for debugging purposes var_dump($headers, $body); 

如果你这样做,还有另一个CURL方法。

一旦你开始了PHP curl扩展的工作方式,把各种标志和setopt()调用结合起来,这是相当直接的。 在这个例子中,我有一个variables$ xml,它包含了我准备发送的XML – 我将把它的内容发布到示例的testing方法中。

 $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()设置一些选项。 这些告诉PHP我们正在发送一个post请求,并且我们正在发送一些数据,提供数据。 CURLOPT_RETURNTRANSFER标志告诉curl给我们输出curl_exec的返回值,而不是输出它。 然后,我们打电话,closures连接 – 结果是$回应。

如果你有机会使用Wordpress来开发你的应用程序(这实际上是一个获取授权,信息页面,甚至非常简单的东西的便捷方式),你可以使用下面的代码片段:

 $response = wp_remote_post( $url, array('body' => $parameters)); if ( is_wp_error( $response ) ) { // $response->get_error_message() } else { // $response['body'] } 

它使用不同的方式来制作实际的HTTP请求,具体取决于Web服务器上可用的内容。 有关更多详细信息,请参阅HTTP API文档 。

如果您不想开发自定义主题或插件来启动Wordpress引擎,则可以在wordpress根目录下的一个隔离的PHP文件中执行以下操作:

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

它不会显示任何主题或输出任何HTML,只需使用Wordpress API即可!

我正在寻找类似的问题,并find了一个更好的方法来做到这一点。 所以在这里。

你可以简单地把下面一行放在redirect页面上(比如page1.php)。

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

我需要这个redirectPOST请求的REST API调用。 该解决scheme能够redirect发布数据以及自定义标题值。

这里是参考链接 。

还有一个你可以使用的

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

点击这里查看详情

我想补充一些关于Fred Tanrikut基于curl的答案的想法。 我知道他们中的大多数已经写在上面的答案中,但我认为这是一个好主意,要显示一个包含所有这些答案的答案。

这里是我写的基于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从请求数组中获取查询string(也可以使用数组本身,因此请参阅: http : //php.net/manual/en/function.curl-setopt.php )
  • 返回响应而不是回应它。 顺便说一句,你可以通过删除行来避免返回curl_setopt($ ch,CURLOPT_RETURNTRANSFER,true); 。 之后,返回值是一个布尔值(true =请求成功,否则发生错误),并响应回应。 请参阅: http : //php.net/en/manual/function.curl-exec.php
  • 使用curl_close清理会话closures和删除卷发处理程序。 请参阅: http : //php.net/manual/en/function.curl-close.php
  • curl_setopt函数的布尔值代替使用任何数字(我知道任何数字不等于零也被认为是true,但是使用true会生成更可读的代码,但这只是我的意见)
  • 能够进行HTTP-PUT / DELETE调用(用于RESTful服务testing)

使用示例

得到

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

POST

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

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

删除

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

testing

你也可以通过使用这个简单的类来做一些很酷的服务testing。

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

试试PEAR的HTTP_Request2包来轻松发送POST请求。 或者,您可以使用PHP的curl函数或使用PHP stream上下文 。

HTTP_Request2也可以模拟出服务器,所以你可以很容易的unit testing你的代码