Как отправить запрос POST с PHP?

На самом деле я хочу прочитать содержимое, которое появляется после поискового запроса, когда это будет сделано. Проблема в том, что 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; } } 

улучшения

  • Используя http_build_query, чтобы получить строку запроса из массива request (вы также можете использовать массив, поэтому см. http://php.net/manual/en/function.curl-setopt.php )
  • Возврат ответа вместо эхо-сигнала. Btw вы можете избежать возврата, удалив строку curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, true); , После этого возвращаемое значение является логическим (true = запрос был успешным, в противном случае произошла ошибка), и ответ был эхом. См .: http://php.net/en/manual/function.curl-exec.php
  • Чистое закрытие сеанса и удаление обработчика завитушек с помощью curl_close . См .: http://php.net/manual/en/function.curl-close.php
  • Использование логических значений для функции curl_setopt вместо использования любого числа. (Я знаю, что любое число, не равное нулю, также считается истинным, но использование true генерирует более читаемый код, но это только мое мнение)
  • Возможность совершать вызовы HTTP-PUT / DELETE (полезно для тестирования тестирования RESTful)

Пример использования

ПОЛУЧИТЬ

 $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 также позволяет издеваться над сервером, поэтому вы можете легко тестировать свой код