Question Comment envoyer une requête POST avec PHP?


En fait, je veux lire le contenu qui vient après la requête de recherche, quand c'est fait. Le problème est que l'URL n'accepte que POST méthodes, et il ne prend aucune mesure avec GET méthode...

Je dois lire tous les contenus avec l'aide de domdocument ou file_get_contents(). Y at-il une méthode qui me permettra d'envoyer des paramètres avec POST méthode, puis lire le contenu via PHP?


526
2018-04-13 10:06


origine


Réponses:


Méthode sans CURL avec 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);

Voir le manuel PHP pour plus d'informations sur la méthode et comment ajouter des en-têtes, par exemple:


1045
2017-07-07 10:27



J'ai essayé celui-ci et ça fonctionne bien ... comme je l'ai demandé ..

<?php
$url = $file_name;
$fields = array(
            '__VIEWSTATE'=>urlencode($state),
            '__EVENTVALIDATION'=>urlencode($valid),
            'btnSubmit'=>urlencode('Submit')
        );

//url-ify the data for the POST
foreach($fields as $key=>$value) { $fields_string .= $key.'='.$value.'&'; }
$fields_string = rtrim($fields_string,'&');

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

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

67
2018-04-15 12:15



J'utilise la fonction suivante pour publier des données en utilisant curl. $ data est un tableau de champs à publier (sera encodé correctement en utilisant http_build_query). Les données sont codées à l'aide de l'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 mentionne que http_build_query peut être omis puisque curl encodera correctement le tableau passé au paramètre CURLOPT_POSTFIELDS, mais sachez que dans ce cas les données seront codées en utilisant multipart / form-data.

J'utilise cette fonction avec des API qui s'attendent à ce que les données soient encodées en utilisant application / x-www-form-urlencoded. C'est pourquoi j'utilise http_build_query ().


41
2018-01-27 19:16



Je vous recommande d'utiliser le paquet open-source bouffer Cette unité est entièrement testée et utilise les dernières pratiques de codage.

Installation de Guzzle

Accédez à la ligne de commande dans votre dossier de projet et tapez la commande suivante (en supposant que vous avez déjà le gestionnaire de paquets compositeur installée). Si vous avez besoin d'aide pour installer Composer, vous devriez jeter un oeil ici.

php composer.phar require guzzlehttp/guzzle

Utilisation de Guzzle pour envoyer une requête POST

L'utilisation de Guzzle est très simple car il utilise une API orientée objet légère:

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

34
2018-04-27 17:23



Il y a une autre méthode CURL si vous allez dans cette direction.

C'est assez simple une fois que vous obtenez votre tête autour de la façon dont l'extension PHP curl fonctionne, en combinant divers drapeaux avec des appels setopt (). Dans cet exemple, j'ai une variable $ xml qui contient le XML que j'ai préparé pour envoyer - je vais poster le contenu de cette méthode de test à l'exemple.

$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

Nous avons d'abord initialisé la connexion, puis nous avons défini des options en utilisant setopt (). Ceux-ci disent à PHP que nous faisons une demande de post, et que nous envoyons des données avec lui, fournissant les données. L'indicateur CURLOPT_RETURNTRANSFER indique à curl de nous donner la sortie en tant que valeur de retour de curl_exec plutôt que de la sortir. Ensuite, nous faisons l'appel et fermons la connexion - le résultat est en $ réponse.


20
2017-09-15 10:29



Si, par hasard, vous utilisez Wordpress pour développer votre application (c'est en fait un moyen pratique d'obtenir une autorisation, des pages d'informations, etc., même pour des choses très simples), vous pouvez utiliser l'extrait suivant:

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

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

Il utilise différentes manières de faire la requête HTTP réelle, en fonction de ce qui est disponible sur le serveur web. Pour plus de détails, voir le Documentation de l'API HTTP.

Si vous ne voulez pas développer un thème ou un plugin personnalisé pour démarrer le moteur Wordpress, vous pouvez simplement faire ce qui suit dans un fichier PHP isolé dans la racine wordpress:

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

// ... your code

Il ne montrera aucun thème ou ne sortira aucun code HTML, il suffit de taper avec les API Wordpress!


16
2017-10-07 08:05



Je voudrais ajouter quelques réflexions sur la réponse de Fred Tanrikut. Je sais que la plupart d'entre eux sont déjà écrits dans les réponses ci-dessus, mais je pense que c'est une bonne idée de montrer une réponse qui comprend tous ensemble.

Voici la classe que j'ai écrite pour faire des requêtes HTTP-GET / POST / PUT / DELETE basées sur curl, concernant à peu près le corps de la réponse:

class HTTPRequester {
    /**
     * @description Make HTTP-GET call
     * @param       $url
     * @param       array $params
     * @return      HTTP-Response body or an empty string if the request fails or is empty
     */
    public static function HTTPGet($url, array $params) {
        $query = http_build_query($params); 
        $ch    = curl_init($url.'?'.$query);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HEADER, false);
        $response = curl_exec($ch);
        curl_close($ch);
        return $response;
    }
    /**
     * @description Make HTTP-POST call
     * @param       $url
     * @param       array $params
     * @return      HTTP-Response body or an empty string if the request fails or is empty
     */
    public static function HTTPPost($url, array $params) {
        $query = http_build_query($params);
        $ch    = curl_init();
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HEADER, false);
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $query);
        $response = curl_exec($ch);
        curl_close($ch);
        return $response;
    }
    /**
     * @description Make HTTP-PUT call
     * @param       $url
     * @param       array $params
     * @return      HTTP-Response body or an empty string if the request fails or is empty
     */
    public static function HTTPPut($url, array $params) {
        $query = \http_build_query($params);
        $ch    = \curl_init();
        \curl_setopt($ch, \CURLOPT_RETURNTRANSFER, true);
        \curl_setopt($ch, \CURLOPT_HEADER, false);
        \curl_setopt($ch, \CURLOPT_URL, $url);
        \curl_setopt($ch, \CURLOPT_CUSTOMREQUEST, 'PUT');
        \curl_setopt($ch, \CURLOPT_POSTFIELDS, $query);
        $response = \curl_exec($ch);
        \curl_close($ch);
        return $response;
    }
    /**
     * @category Make HTTP-DELETE call
     * @param    $url
     * @param    array $params
     * @return   HTTP-Response body or an empty string if the request fails or is empty
     */
    public static function HTTPDelete($url, array $params) {
        $query = \http_build_query($params);
        $ch    = \curl_init();
        \curl_setopt($ch, \CURLOPT_RETURNTRANSFER, true);
        \curl_setopt($ch, \CURLOPT_HEADER, false);
        \curl_setopt($ch, \CURLOPT_URL, $url);
        \curl_setopt($ch, \CURLOPT_CUSTOMREQUEST, 'DELETE');
        \curl_setopt($ch, \CURLOPT_POSTFIELDS, $query);
        $response = \curl_exec($ch);
        \curl_close($ch);
        return $response;
    }
}

Améliorations

  • Utiliser http_build_query pour extraire la chaîne de requête d'un tableau de requêtes (vous pouvez également utiliser le tableau lui-même, voir donc: http://php.net/manual/en/function.curl-setopt.php)
  • Renvoyer la réponse au lieu de l'écho. Btw vous pouvez éviter le retour en supprimant la ligne curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, true);. Après cela, la valeur de retour est un booléen (true = la requête a réussi sinon une erreur est survenue) et la réponse est renvoyée. Voir: http://php.net/fr/manual/function.curl-exec.php
  • Nettoyer la fermeture et la suppression de la session du curl-handler en utilisant curl_close. Voir: http://php.net/manual/fr/function.curl-close.php
  • Utilisation de valeurs booléennes pour curl_setopt Fonctionne au lieu d'utiliser n'importe quel nombre (je sais que tout nombre différent de zéro est également considéré comme vrai, mais l'utilisation de vrai génère un code plus lisible, mais c'est juste mon opinion)
  • Possibilité d'effectuer des appels HTTP-PUT / DELETE (utile pour les tests de service RESTful)

Exemple d'utilisation

OBTENIR

$response = HTTPRequester::HTTPGet("http://localhost/service/foobar.php", array("getParam" => "foobar"));

POSTER

$response = HTTPRequester::HTTPPost("http://localhost/service/foobar.php", array("postParam" => "foobar"));

METTRE

$response = HTTPRequester::HTTPPut("http://localhost/service/foobar.php", array("putParam" => "foobar"));

EFFACER

$response = HTTPRequester::HTTPDelete("http://localhost/service/foobar.php", array("deleteParam" => "foobar"));

Essai

Vous pouvez également faire quelques tests de service en utilisant cette classe simple.

class HTTPRequesterCase extends TestCase {
    /**
     * @description test static method HTTPGet
     */
    public function testHTTPGet() {
        $requestArr = array("getLicenses" => 1);
        $url        = "http://localhost/project/req/licenseService.php";
        $this->assertEquals(HTTPRequester::HTTPGet($url, $requestArr), '[{"error":false,"val":["NONE","AGPL","GPLv3"]}]');
    }
    /**
     * @description test static method HTTPPost
     */
    public function testHTTPPost() {
        $requestArr = array("addPerson" => array("foo", "bar"));
        $url        = "http://localhost/project/req/personService.php";
        $this->assertEquals(HTTPRequester::HTTPPost($url, $requestArr), '[{"error":false}]');
    }
    /**
     * @description test static method HTTPPut
     */
    public function testHTTPPut() {
        $requestArr = array("updatePerson" => array("foo", "bar"));
        $url        = "http://localhost/project/req/personService.php";
        $this->assertEquals(HTTPRequester::HTTPPut($url, $requestArr), '[{"error":false}]');
    }
    /**
     * @description test static method HTTPDelete
     */
    public function testHTTPDelete() {
        $requestArr = array("deletePerson" => array("foo", "bar"));
        $url        = "http://localhost/project/req/personService.php";
        $this->assertEquals(HTTPRequester::HTTPDelete($url, $requestArr), '[{"error":false}]');
    }
}

12
2017-08-03 20:52