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()
метод и пусть класс выше реализует его. Тогда вы всегда можете поменять эту реализацию с другим адаптером вашего like, без каких-либо побочных эффектов для вашего приложения.
использование 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-сообщения:
поместите это в файл под названием 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',
]);
Если форма использует перенаправления, аутентификацию, cookies, SSL (https) или что-либо еще, кроме полностью открытого скрипта, ожидающего переменные POST, вы начнете скрежетать зубами очень быстро. Взгляните на Снупи, который делает именно то, что вы имеете в виду, устранив необходимость создать много накладных расходов.
вот некоторые шаблонные коды для 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'; }