PHP + curl, HTTP POST пример кода?
может ли кто-нибудь показать мне, как сделать PHP curl с помощью HTTP-сообщения?
Я хочу отправить данные следующим образом:
username=user1, password=passuser1, gender=1
до www.domain.com
Я ожидаю, что завиток вернет ответ, как result=OK
. Есть ли примеры?
10 ответов:
<?php // // A very simple PHP example that sends a HTTP POST to a remote site // $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,"http://www.example.com/tester.phtml"); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, "postvar1=value1&postvar2=value2&postvar3=value3"); // In real life you should use something like: // curl_setopt($ch, CURLOPT_POSTFIELDS, // http_build_query(array('postvar1' => 'value1'))); // Receive server response ... curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $server_output = curl_exec($ch); curl_close ($ch); // Further processing ... if ($server_output == "OK") { ... } else { ... } ?>
процедурные
// set post fields $post = [ 'username' => 'user1', 'password' => 'passuser1', 'gender' => 1, ]; $ch = curl_init('http://www.example.com'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $post); // execute! $response = curl_exec($ch); // close the connection, release resources used curl_close($ch); // do anything you want with your response var_dump($response);
объектно-ориентированное
<?php namespace MyApp\Http; class Curl { /** @var resource cURL handle */ private $ch; /** @var mixed The response */ private $response = false; /** * @param string $url * @param array $options */ public function __construct($url, array $options = array()) { $this->ch = curl_init($url); foreach ($options as $key => $val) { curl_setopt($this->ch, $key, $val); } curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, true); } /** * Get the response * @return string * @throws \RuntimeException On cURL error */ public function getResponse() { if ($this->response) { return $this->response; } $response = curl_exec($this->ch); $error = curl_error($this->ch); $errno = curl_errno($this->ch); if (is_resource($this->ch)) { curl_close($this->ch); } if (0 !== $errno) { throw new \RuntimeException($error, $errno); } return $this->response = $response; } /** * Let echo out the response * @return string */ public function __toString() { return $this->getResponse(); } } // usage $curl = new \MyApp\Http\Curl('http://www.example.com', array( CURLOPT_POSTFIELDS => array('username' => 'user1') )); try { echo $curl; } catch (\RuntimeException $ex) { die(sprintf('Http error %s with code %d', $ex->getMessage(), $ex->getCode())); }
Примечание здесь: было бы лучше, чтобы создать какой-то интерфейс под названием
AdapterInterface
напримерgetResponse()
метод и пусть класс выше реализовать его. Тогда вы всегда можете поменять эту реализацию с другим адаптером вашего типа, без каких-либо побочных эффектов для вашего приложения.использование HTTPS / шифрование трафика
обычно есть проблема с cURL в PHP под операционная система Windows. При попытке подключиться к защищенной конечной точке https вы получите сообщение об ошибке
certificate verify failed
.что большинство людей делают здесь, чтобы сказать библиотеке cURL просто игнорировать ошибки сертификата и продолжить (
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
). Поскольку это заставит ваш код работать, вы вводите огромную дыру в безопасности и позволяете злоумышленникам выполнять различные атаки на ваше приложение, такие как Человек В Середине нападение или подобные.никогда, никогда не делать этого. Вместо этого вам просто нужно изменить свой
php.ini
и скажите PHP, где вашCA Certificate
файл должен позволить ему правильно проверять сертификаты:; modify the absolute path to the cacert.pem file curl.cainfo=c:\php\cacert.pem
последние
cacert.pem
можно скачать из интернета или извлеченные из вашего любимого браузера. При изменении любогоphp.ini
настройки не забудьте перезагрузить веб-сервер.
живой пример использования php curl_exec для выполнения HTTP post:
поместите это в файл под названием foobar.php:
<?php $ch = curl_init(); $skipper = "luxury assault recreational vehicle"; $fields = array( 'penguins'=>$skipper, 'bestpony'=>'rainbowdash'); $postvars = ''; foreach($fields as $key=>$value) { $postvars .= $key . "=" . $value . "&"; } $url = "http://www.google.com"; curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch,CURLOPT_POST, 1); //0 for a get request curl_setopt($ch,CURLOPT_POSTFIELDS,$postvars); curl_setopt($ch,CURLOPT_RETURNTRANSFER, true); curl_setopt($ch,CURLOPT_CONNECTTIMEOUT ,3); curl_setopt($ch,CURLOPT_TIMEOUT, 20); $response = curl_exec($ch); print "curl response is:" . $response; curl_close ($ch); ?>
затем запустить его с помощью команды
php foobar.php
, он сбрасывает этот вид вывода на экран:<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Title</title> <meta http-equiv="Pragma" content="no-cache"> <meta http-equiv="Expires" content="0"> <body> A mountain of content... </body> </html>
Итак, вы сделали сообщение PHP, чтобы www.google.com и отправил ему некоторые данные.
если бы сервер был запрограммирован на чтение в переменных post, он мог бы решить сделать что-то другое на основе этого.
Это можно легко достичь с помощью:
<?php $post = [ 'username' => 'user1', 'password' => 'passuser1', 'gender' => 1, ]; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'http://www.domain.com'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post)); $response = curl_exec($ch); var_export($response);
Curl Post + обработка ошибок + набор заголовков [благодаря @mantas-d]:
function curlPost($url, $data=NULL, $headers = NULL) { $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); if(!empty($data)){ curl_setopt($ch, CURLOPT_POSTFIELDS, $data); } if (!empty($headers)) { curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); } $response = curl_exec($ch); if (curl_error($ch)) { trigger_error('Curl Error:' . curl_error($ch)); } curl_close($ch); return $response; } curlPost('google.com', [ 'username' => 'admin', 'password' => '12345', ]);
Если форма использует перенаправления, аутентификацию, куки, SSL (https) или что-либо еще, кроме полностью открытого сценария, ожидающего переменных POST, вы начнете скрежетать зубами очень быстро. Взгляните на Snoopy, который делает именно то, что вы имеете в виду, устранив необходимость создать много накладных расходов.
вот некоторые шаблонный код для PHP + curl http://www.webbotsspidersscreenscrapers.com/DSP_download.php
включение в эти библиотеки упростит разработку
<?php # Initialization include("LIB_http.php"); include("LIB_parse.php"); $product_array=array(); $product_count=0; # Download the target (store) web page $target = "http://www.tellmewhenitchanges.com/buyair"; $web_page = http_get($target, ""); ... ?>
более простой ответ, если вы передаете информацию на свой собственный сайт, - это использовать переменную сеанса. Начните php страницу с:
session_start();
Если в какой-то момент есть информация, которую вы хотите сгенерировать в PHP и передать на следующую страницу в сеансе, вместо того, чтобы использовать переменную POST, назначьте ее переменной сеанса. Пример:
$_SESSION['message']='www.'.$_GET['school'].'.edu was not found. Please try again.'
затем на следующей странице вы просто ссылаетесь на эту переменную сеанса. Примечание: после того, как вы используете его, убедитесь, что вы уничтожить его, так что это не так сохраняйте после его использования:
if (isset($_SESSION['message'])) {echo $_SESSION['message']; unset($_SESSION['message']);}
curlPost('google.com', [ 'username' => 'admin', 'password' => '12345', ]); function curlPost($url, $data) { $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); $response = curl_exec($ch); if (curl_error($ch)) { throw new \Exception(curl_error($ch)); } curl_close($ch); return $response; }
Если вы попытаетесь войти на сайт с помощью cookies.
этот код:
if ($server_output == "OK") { ... } else { ... }
может не работает, если вы пытаетесь войти в систему, потому что многие сайты возвращает статус 200, но сообщение не является успешным.
простой способ проверить, если сообщение входа в систему успешно, это проверить, если он снова устанавливает куки. Если в выводе есть строка Set-Cookies, это означает, что сообщения не успешны, и он начинает новую сессию.
также сообщение может быть успешным, но статус может быть редирект вместо 200.
чтобы убедиться, что сообщение успешно попробовать это:
следуйте за местоположением после сообщения, поэтому он перейдет на страницу, где сообщение перенаправляется на:
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
и чем проверить, если новые куки, существующие в запросе:
if (!preg_match('/^Set-Cookie:\s*([^;]*)/mi', $server_output)) {echo 'post successful'; } else { echo 'not successful'; }