http request - Come invio una richiesta POST con PHP?




json curl (10)

Se per caso stai usando Wordpress per sviluppare la tua app (è in realtà un modo conveniente per ottenere l'autorizzazione, le pagine di informazioni, ecc. Anche per cose molto semplici), puoi usare il seguente snippet:

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

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

Utilizza diversi modi di fare la richiesta HTTP effettiva, a seconda di ciò che è disponibile sul server web. Per ulteriori dettagli, consultare la documentazione dell'API HTTP .

Se non desideri sviluppare un tema o un plug-in personalizzato per avviare il motore Wordpress, puoi semplicemente eseguire le seguenti operazioni in un file PHP isolato nella radice wordpress:

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

// ... your code

Non mostrerà alcun tema o non produrrà alcun HTML, ma sfrutterà le API di WordPress!

In realtà voglio leggere i contenuti che arrivano dopo la query di ricerca, quando è finito. Il problema è che l'URL accetta solo i metodi POST e non intraprende alcuna azione con il metodo GET ...

Devo leggere tutti i contenuti con l'aiuto di domdocument o file_get_contents() . C'è qualche metodo che mi permetterà di inviare parametri con il metodo POST e quindi leggere i contenuti tramite PHP ?


Vi consiglio di usare il guzzle pacchetto open-source che è completamente testato e usa le ultime pratiche di codifica.

Installazione Guzzle

Vai alla riga di comando nella cartella del progetto e digita il seguente comando (supponendo che tu abbia già installato il composer pacchetti manager). Se hai bisogno di aiuto su come installare Composer, dovresti dare un'occhiata qui .

php composer.phar require guzzlehttp/guzzle

Usare Guzzle per inviare una richiesta POST

L'utilizzo di Guzzle è molto semplice in quanto utilizza un'API orientata agli oggetti leggera:

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

Un'altra alternativa del metodo curl-less di cui sopra è l'uso delle funzioni del flusso nativo:

Una funzione POST con questi può essere semplicemente così:

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

Prova il pacchetto HTTP_Request2 di PEAR per inviare facilmente le richieste POST. In alternativa, è possibile utilizzare le funzioni di arricciatura di PHP o utilizzare un contesto di flusso PHP.

HTTP_Request2 consente anche di prendere in giro il server, in modo da poter testare facilmente il tuo codice


Puoi usare 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;
?>

Io uso la seguente funzione per pubblicare i dati usando curl. $ data è una matrice di campi da pubblicare (sarà codificata correttamente usando http_build_query). I dati sono codificati usando 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 afferma che http_build_query può essere omesso poiché curl codificherà correttamente l'array passato al parametro CURLOPT_POSTFIELDS, ma si avviserà che in questo caso i dati saranno codificati usando multipart / form-data.

Uso questa funzione con le API che prevedono la codifica dei dati utilizzando application / x-www-form-urlencoded. Ecco perché utilizzo http_build_query ().


Stavo cercando un problema simile e ho trovato un approccio migliore per farlo. Quindi qui va.

Puoi semplicemente mettere la seguente riga sulla pagina di reindirizzamento (ad esempio pagina1.php).

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

Ho bisogno di questo per reindirizzare le richieste POST per le chiamate API REST . Questa soluzione è in grado di reindirizzare con i dati dei post, nonché i valori di intestazione personalizzati.

Ecco il link di riferimento .


C'è un altro metodo CURL se stai andando in quel modo.

Questo è abbastanza semplice una volta che hai capito come funziona l'estensione di curl PHP, combinando vari flag con le chiamate setopt (). In questo esempio ho una variabile $ xml che contiene l'XML che ho preparato da inviare - inserirò il contenuto di questo nel metodo di test di esempio.

$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

Per prima cosa abbiamo inizializzato la connessione, quindi abbiamo impostato alcune opzioni usando setopt (). Questi dicono a PHP che stiamo facendo una richiesta di posta, e che stiamo inviando alcuni dati con esso, fornendo i dati. Il flag CURLOPT_RETURNTRANSFER dice a curl di darci l'output come valore di ritorno di curl_exec invece di emetterlo. Quindi effettuiamo la chiamata e chiudiamo la connessione: il risultato è in $ response.


Ce n'è un altro che puoi usare

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

Clicca qui per i dettagli


Importante: si prega di notare che questa risposta è stata scritta nel 2009 e potrebbe non essere la soluzione più conveniente oggi nel 2018. Le alternative online come PDFShift sono migliori oggi rispetto a quelle di allora.

Dai un'occhiata a PrinceXML .

È sicuramente il miglior convertitore HTML / CSS in PDF, anche se non è gratuito (ma hey, anche la tua programmazione potrebbe non essere libera, quindi se ti salva 10 ore di lavoro, sei a casa libera (dato che devi anche prendere in considerazione che le soluzioni alternative richiedono l'installazione di un server dedicato con il software giusto)

Oh sì, ho già detto che questa è la prima (e probabilmente unica) soluzione HTML2PDF che completa ACID2 ?

Esempi PrinceXML





php http post request