¿Alguien puede mostrarme cómo hacer un php curl con un HTTP POST?
Quiero enviar datos como este:
username=user1, password=passuser1, gender=1
A www.domain.com
Espero que el rizo devuelva una respuesta como result=OK
. ¿Hay algún ejemplo?
¿Alguien puede mostrarme cómo hacer un php curl con un HTTP POST?
Quiero enviar datos como este:
username=user1, password=passuser1, gender=1
A www.domain.com
Espero que el rizo devuelva una respuesta como result=OK
. ¿Hay algún ejemplo?
Respuestas:
<?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 { ... }
?>
CURLOPT_POSTFIELDS
es una matriz, el Content-Type
encabezado se establecerá en multipart/form-data
lugar de application/x-www-form-urlencoded
. php.net/manual/en/function.curl-setopt.php
true
lugar de 1
para CURLOPT_POST
.
// 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
// mutatis mutandis
namespace MyApp\Http;
class CurlPost
{
private $url;
private $options;
/**
* @param string $url Request URL
* @param array $options cURL options
*/
public function __construct($url, array $options = [])
{
$this->url = $url;
$this->options = $options;
}
/**
* Get the response
* @return string
* @throws \RuntimeException On cURL error
*/
public function __invoke(array $post)
{
$ch = curl_init($this->url);
foreach ($this->options as $key => $val) {
curl_setopt($ch, $key, $val);
}
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
$response = curl_exec($ch);
$error = curl_error($ch);
$errno = curl_errno($ch);
if (is_resource($ch)) {
curl_close($ch);
}
if (0 !== $errno) {
throw new \RuntimeException($error, $errno);
}
return $response;
}
}
// create curl object
$curl = new \MyApp\Http\CurlPost('http://www.example.com');
try {
// execute the request
echo $curl([
'username' => 'user1',
'password' => 'passuser1',
'gender' => 1,
]);
} catch (\RuntimeException $ex) {
// catch errors
die(sprintf('Http error %s with code %d', $ex->getMessage(), $ex->getCode()));
}
Nota al margen aquí: sería mejor crear algún tipo de interfaz llamada, AdapterInterface
por ejemplo, con getResponse()
método y dejar que la clase anterior lo implemente. Luego, siempre puede intercambiar esta implementación con otro adaptador de su gusto, sin efectos secundarios para su aplicación.
Por lo general, hay un problema con cURL en PHP bajo el sistema operativo Windows. Al intentar conectarse a un punto final protegido https, recibirá un error que le indicará eso certificate verify failed
.
Lo que la mayoría de la gente hace aquí es decirle a la biblioteca cURL que simplemente ignore los errores de certificado y continúe ( curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
). Como esto hará que su código funcione, introduce un gran agujero de seguridad y permite que los usuarios malintencionados realicen varios ataques en su aplicación, como el ataque Man In The Middle o similar .
Nunca, nunca hagas eso. En cambio, simplemente necesita modificar su php.ini
y decirle a PHP dónde está su CA Certificate
archivo para que pueda verificar los certificados correctamente:
; modify the absolute path to the cacert.pem file
curl.cainfo=c:\php\cacert.pem
Lo último cacert.pem
se puede descargar de Internet o extraer de su navegador favorito . Al cambiar cualquier php.ini
configuración relacionada, recuerde reiniciar su servidor web.
Pon esto en un archivo llamado 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);
?>
Luego ejecútelo con el comando php foobar.php
, volcará este tipo de salida en la pantalla:
<!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>
Entonces hiciste una POST PHP a www.google.com y le enviaste algunos datos.
Si el servidor hubiera sido programado para leer las variables de publicación, podría decidir hacer algo diferente en función de eso.
$postvars .= $key . $value;
debería $postvars .= $key . $value ."&";
o no?
$fields
matriz y generará una cadena de consulta.
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($fields));
http_build_query
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
Se puede llegar fácilmente con:
<?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 + Error Handling + Set Headers [gracias a @ 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',
]);
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);
$error = curl_error($ch);
curl_close($ch);
if ($error !== '') {
throw new \Exception($error);
}
return $response;
}
curl_close
dentro de un finally
bloque.
Si el formulario usa redireccionamientos, autenticación, cookies, SSL (https) o cualquier otra cosa que no sea un script totalmente abierto que espera variables POST, comenzará a rechinar los dientes muy rápido. Eche un vistazo a Snoopy , que hace exactamente lo que tiene en mente al tiempo que elimina la necesidad de configurar gran parte de la sobrecarga.
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
Una respuesta más simple SI está pasando información a su propio sitio web es usar una variable SESSION. Comience la página php con:
session_start();
Si en algún momento hay información que desea generar en PHP y pasar a la siguiente página de la sesión, en lugar de utilizar una variable POST, asígnela a una variable SESSION. Ejemplo:
$_SESSION['message']='www.'.$_GET['school'].'.edu was not found. Please try again.'
Luego, en la página siguiente, simplemente haga referencia a esta variable SESIÓN. NOTA: después de usarlo, asegúrese de destruirlo para que no persista después de usarlo:
if (isset($_SESSION['message'])) {echo $_SESSION['message']; unset($_SESSION['message']);}
Aquí hay un código repetitivo para PHP + curl http://www.webbotsspidersscreenscrapers.com/DSP_download.php
incluir en estas bibliotecas simplificará el desarrollo
<?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, "");
...
?>
Si intenta iniciar sesión en el sitio con cookies.
Este código:
if ($server_output == "OK") { ... } else { ... }
Es posible que no funcione si intenta iniciar sesión, porque muchos sitios devuelven el estado 200, pero la publicación no es exitosa.
Una manera fácil de verificar si la publicación de inicio de sesión es exitosa es verificar si configura las cookies nuevamente. Si en la salida tiene una cadena Set-Cookies, esto significa que las publicaciones no son exitosas y comienza una nueva sesión.
Además, la publicación puede ser exitosa, pero el estado se puede redirigir en lugar de 200.
Para estar seguro de que la publicación es exitosa, intente esto:
Siga la ubicación después de la publicación, por lo que irá a la página donde la publicación redirige a:
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
Y luego verifique si existen nuevas cookies en la solicitud:
if (!preg_match('/^Set-Cookie:\s*([^;]*)/mi', $server_output))
{echo 'post successful'; }
else { echo 'not successful'; }
Ejemplos de envío de formulario y datos sin procesar :
$curlHandler = curl_init();
curl_setopt_array($curlHandler, [
CURLOPT_URL => 'https://postman-echo.com/post',
CURLOPT_RETURNTRANSFER => true,
/**
* Specify POST method
*/
CURLOPT_POST => true,
/**
* Specify array of form fields
*/
CURLOPT_POSTFIELDS => [
'foo' => 'bar',
'baz' => 'biz',
],
]);
$response = curl_exec($curlHandler);
curl_close($curlHandler);
echo($response);
http_build_query()
para manejar parámetros; solo pasa la matriz aCURLOPT_POSTFIELDS
es suficiente.