实际上,我想阅读搜索查询之后的内容,完成之后。问题是URL仅接受POST
方法,并且对GET
方法不采取任何操作...
我必须借助domdocument
或阅读所有内容file_get_contents()
。有什么方法可以让我使用POST
method 发送参数,然后通过读取内容PHP
?
实际上,我想阅读搜索查询之后的内容,完成之后。问题是URL仅接受POST
方法,并且对GET
方法不采取任何操作...
我必须借助domdocument
或阅读所有内容file_get_contents()
。有什么方法可以让我使用POST
method 发送参数,然后通过读取内容PHP
?
Answers:
PHP5的无CURL方法:
$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手册,例如:
file_get_contents()
仅当启用了fopen包装器时,URL才能用作文件名。见php.net/manual/en/…–
file_get_contents()
file_get_contents()
它是PHP核心的一部分。另外,不必要地使用扩展程序可以扩大应用程序的攻击范围。例如Google php curl cve
您可以使用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提到可以省略http_build_query,因为curl将正确编码传递给CURLOPT_POSTFIELDS参数的数组,但是建议在这种情况下,数据将使用multipart / form-data进行编码。
我将此功能与希望使用application / x-www-form-urlencoded编码的API一起使用。这就是为什么我使用http_build_query()。
http_build_query
将$data
数组转换为字符串,避免输出为multipart / form-data。
... CURLOPT_RETURNTRANSFER, true
结果$response
包含其中的内容。
file_get_contents
,您的解决方案需要CURL,而许多人还没有。因此您的解决方案可能正在工作,但未回答如何使用本机内置文件/流功能执行此操作的问题。
我建议你使用开源包狂饮即完全单元测试,并采用了最新的编码实践。
安装枪口
转到项目文件夹中的命令行,然后键入以下命令(假设您已经安装了程序包管理器作曲家)。如果您需要有关如何安装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方法。
一旦掌握了PHP curl扩展的工作方式(将各种标志与setopt()调用结合在一起),这将非常简单。在此示例中,我有一个变量$ 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()设置一些选项。这些告诉PHP我们正在发出一个发布请求,并且我们正在发送一些数据,并提供数据。CURLOPT_RETURNTRANSFER标志告诉curl向我们提供输出作为curl_exec的返回值,而不是输出它。然后我们进行呼叫并关闭连接-结果在$ response中。
$ch
不是$curl
,对吗?
如果您有机会使用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即可!
我想对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;
}
}
$response = HTTPRequester::HTTPGet("http://localhost/service/foobar.php", array("getParam" => "foobar"));
$response = HTTPRequester::HTTPPost("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"));
您也可以使用此简单的类进行一些很酷的服务测试。
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}]');
}
}
stream_context_create()
:
使用选项预设中提供的任何选项创建并返回流上下文。
stream_get_contents()
:
与相同
file_get_contents()
,不同之处在于stream_get_contents()
它对已经打开的流资源进行操作,并以字符串形式返回剩余的内容,最大长度为maxlength个字节,并从指定的offset开始。
具有这些功能的POST函数可以像这样:
<?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;
}
fclose()
如果$fp
是,则不必使用false
。因为fclose()
期望资源是参数。
更好的发送GET
或POST
请求方式PHP
如下:
<?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;
}
?>
该代码取自此处的官方文档:http://docs.php.net/manual/da/httprequest.send.php
还有更多可以使用的
<?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);
?>
我在寻找类似的问题,并且找到了一种更好的方法。所以就到这里。
您只需将以下行放在重定向页面上(例如page1.php)。
header("Location: URL", TRUE, 307); // Replace URL with to be redirected URL, e.g. final.php
我需要它来重定向REST API调用的POST请求。该解决方案能够使用发布数据以及自定义标头值进行重定向。
这是参考链接。
redirect a page request with POST param
vs与之间的区别send POST request
。对我来说,两者的目的是相同的,如果我错了,请纠正我。
这里仅使用一个没有cURL的命令。超级简单。
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'
])
]
]));
尝试使用PEAR的HTTP_Request2包轻松发送POST请求。另外,您可以使用PHP的curl函数或使用PHP 流上下文。
HTTP_Request2还可以模拟服务器,因此您可以轻松地对代码进行单元测试