valores - variables php a php




¿Cómo envío una solicitud POST con PHP? (8)

En realidad, quiero leer los contenidos que vienen después de la consulta de búsqueda, cuando se realiza. El problema es que la URL solo acepta métodos POST , y no realiza ninguna acción con el método GET ...

Tengo que leer todos los contenidos con la ayuda de domdocument o file_get_contents() . ¿Hay algún método que me permita enviar parámetros con el método POST y luego leer los contenidos a través de PHP ?


Estaba buscando un problema similar y encontré un mejor enfoque para hacer esto. Así que aquí va.

Simplemente puede colocar la siguiente línea en la página de redireccionamiento (por ejemplo, page1.php).

header("Location: URL", TRUE, 307); // Replace URL with to be redirected URL, e.g. final.php

Necesito esto para redirigir las solicitudes POST para las llamadas de la API REST . Esta solución es capaz de redirigir con datos de publicación, así como valores de encabezado personalizados.

Aquí está el enlace de referencia .


Hay otro método CURL si vas por ese camino.

Esto es bastante sencillo una vez que entiendes cómo funciona la extensión de enrollamiento de PHP, combinando varias banderas con llamadas a setopt (). En este ejemplo, tengo una variable $ xml que contiene el XML que he preparado para enviar. Voy a publicar el contenido de este en el método de prueba de ejemplo.

$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

Primero inicializamos la conexión, luego configuramos algunas opciones usando setopt (). Éstos le dicen a PHP que estamos realizando una solicitud posterior, y que estamos enviando algunos datos con ellos, suministrando los datos. La bandera CURLOPT_RETURNTRANSFER le dice a curl que nos dé la salida como el valor de retorno de curl_exec en lugar de enviarla. Luego hacemos la llamada y cerramos la conexión, el resultado está en $ response.


Le recomiendo que use la guzzle paquete de código abierto que está totalmente probada por la unidad y utiliza las últimas prácticas de codificación.

Instalación de Guzzle

Vaya a la línea de comandos en la carpeta de su proyecto y escriba el siguiente comando (asumiendo que ya tiene el gestor de paquetes instalado). Si necesita ayuda sobre cómo instalar Composer, debería echar un vistazo aquí .

php composer.phar require guzzlehttp/guzzle

Usando Guzzle para enviar una solicitud POST

El uso de Guzzle es muy sencillo, ya que utiliza una API ligera orientada a objetos:

// 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, e.g. read the headers, body, etc.
$headers = $response->getHeaders();
$body = $response->getBody();

// Output headers and body for debugging purposes
var_dump($headers, $body);

Método sin CURL con 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);

Consulte el manual de PHP para obtener más información sobre el método y cómo agregar encabezados, por ejemplo:


Otra alternativa del método sin curvatura anterior es usar las funciones de flujo nativo:

Una función POST con estos puede ser simplemente así:

<?php

function post_request($url, array $params) {
  $query_content = http_build_query($params);
  $fp = fopen($url, 'r', FALSE, // do not use_include_path
    stream_context_create([
    'http' => [
      'header'  => [ // header array does not need '\r\n'
        'Content-type: application/x-www-form-urlencoded',
        'Content-Length: ' . strlen($query_content)
      ],
      'method'  => 'POST',
      'content' => $query_content
    ]
  ]));
  if ($fp === FALSE) {
    fclose($fp);
    return json_encode(['error' => 'Failed to get contents...']);
  }
  $result = stream_get_contents($fp); // no maxlength/offset
  fclose($fp);
  return $result;
}

Podrías usar cURL:

<?php
//The url you wish to send the POST request to
$url = $file_name;

//The data you want to send via POST
$fields = [
    '__VIEWSTATE '      => $state,
    '__EVENTVALIDATION' => $valid,
    'btnSubmit'         => 'Submit'
];

//url-ify the data for the POST
$fields_string = http_build_query($fields);

//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);

//So that curl_exec returns the contents of the cURL; rather than echoing it
curl_setopt($ch,CURLOPT_RETURNTRANSFER, true); 

//execute post
$result = curl_exec($ch);
echo $result;
?>

Si por casualidad está usando Wordpress para desarrollar su aplicación (en realidad es una forma conveniente de obtener autorización, páginas de información, etc. incluso para cosas muy simples), puede usar el siguiente fragmento de código:

$response = wp_remote_post( $url, array('body' => $parameters));

if ( is_wp_error( $response ) ) {
    // $response->get_error_message()
} else {
    // $response['body']
}

Utiliza diferentes formas de realizar la solicitud HTTP real, dependiendo de lo que esté disponible en el servidor web. Para más detalles, consulte la documentación de la API HTTP .

Si no desea desarrollar un tema o complemento personalizado para iniciar el motor de Wordpress, puede hacer lo siguiente en un archivo PHP aislado en la raíz de WordPress:

require_once( dirname(__FILE__) . '/wp-load.php' );

// ... your code

No mostrará ningún tema ni generará ningún HTML, ¡simplemente elimine las API de Wordpress!


Utilizo la siguiente función para publicar datos usando curl. $ data es una matriz de campos para publicar (se codificará correctamente usando http_build_query). Los datos se codifican utilizando application / x-www-form-urlencoded.

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;
}

@Edward menciona que http_build_query puede omitirse ya que curl codificará correctamente la matriz pasada al parámetro CURLOPT_POSTFIELDS, pero tenga en cuenta que en este caso los datos se codificarán utilizando multipart / form-data.

Utilizo esta función con API que esperan que los datos se codifiquen utilizando application / x-www-form-urlencoded. Es por eso que uso http_build_query ().







request