На самом деле я хочу прочитать содержимое, которое появляется после поискового запроса, когда это будет сделано. Проблема в том, что URL-адрес принимает только методы POST
, и он не предпринимает никаких действий с помощью метода GET
…
Я должен прочитать все содержимое с помощью domdocument
или file_get_contents()
. Есть ли какой-либо метод, который позволит мне отправлять параметры с помощью метода POST
а затем читать содержимое через PHP
?
Метод CURL-less с 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);
См. Руководство по PHP для получения дополнительной информации о методе и способах добавления заголовков, например:
Я попробовал этот, и он отлично работает … как я спросил.
<?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; }
Я рекомендую вам использовать жужжание с открытым исходным кодом, которое полностью тестируется на устройстве и использует новейшие методы кодирования.
Установка 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, eg read the headers, body, etc. $headers = $response->getHeaders(); $body = $response->getBody(); // Output headers and body for debugging purposes var_dump($headers, $body);
Есть другой метод CURL, если вы идете этим путем.
Это довольно просто, как только вы получаете голову вокруг того, как работает расширение curl PHP, сочетая различные флаги с вызовами 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.
Если вы случайно используете WordPress для разработки своего приложения (на самом деле это удобный способ получить авторизацию, информационные страницы и т. Д. Даже для очень простых вещей), вы можете использовать следующий фрагмент:
$response = wp_remote_post( $url, array('body' => $parameters)); if ( is_wp_error( $response ) ) { // $response->get_error_message() } else { // $response['body'] }
Он использует разные способы создания фактического HTTP-запроса, в зависимости от того, что доступно на веб-сервере. Для получения дополнительной информации см. Документацию по API HTTP .
Если вы не хотите разрабатывать настраиваемую тему или плагин для запуска механизма WordPress, вы можете просто сделать следующее в изолированном PHP-файле в корневом каталоге wordpress:
require_once( dirname(__FILE__) . '/wp-load.php' ); // ... your code
Он не будет показывать какую-либо тему или выводить какой-либо HTML-код, просто взломайте API-интерфейсы WordPress!
Я искал аналогичную проблему и нашел лучший способ сделать это. Итак, вот оно.
Вы можете просто поместить следующую строку на страницу перенаправления (например, page1.php).
header("Location: URL", TRUE, 307); // Replace URL with to be redirected URL, eg final.php
Мне нужно это, чтобы перенаправлять запросы POST для вызовов REST API. Это решение может перенаправлять с пост-данными, а также с настраиваемыми значениями заголовков.
Вот ссылка .
Я хотел бы добавить некоторые мысли о кривизном ответе Фреда Танрикута. Я знаю, что большинство из них уже написаны в ответах выше, но я думаю, что это хорошая идея, чтобы показать ответ, который включает в себя все вместе.
Вот класс, который я написал, чтобы сделать запросы HTTP-GET / POST / PUT / DELETE на основе curl, касающиеся только тела ответа:
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::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"));
Вы также можете сделать несколько классных тестов, используя этот простой класс.
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}]'); } }
Есть еще один, который вы можете использовать
<?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); ?>
Нажмите здесь для подробностей
Попробуйте пакет HTTP_Request2 PEAR, чтобы легко отправлять запросы POST. Кроме того, вы можете использовать функции curl PHP или использовать контекст потока PHP.
HTTP_Request2 также позволяет издеваться над сервером, поэтому вы можете легко тестировать свой код