RAW POST en utilisant cURL en PHP


126

Comment puis-je faire un RAW POST en PHP en utilisant cURL?

Publication brute comme dans sans aucun encodage, et mes données sont stockées dans une chaîne. Les données doivent être formatées comme ceci:

... usual HTTP header ...
Content-Length: 1039
Content-Type: text/plain

89c5fdataasdhf kajshfd akjshfksa hfdkjsa falkjshfsa
ajshd fkjsahfd lkjsahflksahfdlkashfhsadkjfsalhfd
ajshdfhsafiahfiuwhflsf this is just data from a string
more data kjahfdhsakjfhsalkjfdhalksfd

Une option consiste à écrire manuellement l'intégralité de l'en-tête HTTP envoyé, mais cela semble moins optimal.

Quoi qu'il en soit, puis-je simplement passer des options à curl_setopt () qui disent utiliser POST, utiliser text / plain et envoyer les données brutes à partir d'un $variable?

Réponses:


229

Je viens de trouver la solution, une sorte de réponse à ma propre question au cas où quelqu'un d'autre tomberait dessus.

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL,            "http://url/url/url" );
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt($ch, CURLOPT_POST,           1 );
curl_setopt($ch, CURLOPT_POSTFIELDS,     "body goes here" ); 
curl_setopt($ch, CURLOPT_HTTPHEADER,     array('Content-Type: text/plain')); 

$result=curl_exec ($ch);

4
php définira-t-il l'en-tête content-length pour vous ou devriez-vous le définir également?
Eric Bloch

3
Je ne peux pas du tout faire fonctionner cela. J'ai une page sur laquelle j'essaie de publier des données brutes. Cette page enregistre toutes les données brutes qu'elle reçoit dans une table de base de données. Il n'y a pas du tout de nouvelles lignes. Savez-vous si quelque chose a changé ici depuis '09?
James

1
Cela fonctionne pour moi, sans spécifier d'en-tête HTTP.
xryl669

12
Je viens de réaliser que le corps va ici peut inclure n'importe quelle chaîne json valide.
shasi kanth

1
Il existe une limite 2G pour ce message brut. Si vous essayez d'envoyer un fichier de plus de 2 Go, il sera tronqué à 2 Go. C'est une limitation du type de chaîne en cours de chargement.
Kaden Yealy

5

Implémentation avec la bibliothèque Guzzle:

use GuzzleHttp\Client;
use GuzzleHttp\RequestOptions;

$httpClient = new Client();

$response = $httpClient->post(
    'https://postman-echo.com/post',
    [
        RequestOptions::BODY => 'POST raw request content',
        RequestOptions::HEADERS => [
            'Content-Type' => 'application/x-www-form-urlencoded',
        ],
    ]
);

echo(
    $response->getBody()->getContents()
);

Extension PHP CURL:

$curlHandler = curl_init();

curl_setopt_array($curlHandler, [
    CURLOPT_URL => 'https://postman-echo.com/post',
    CURLOPT_RETURNTRANSFER => true,

    /**
     * Specify POST method
     */
    CURLOPT_POST => true,

    /**
     * Specify request content
     */
    CURLOPT_POSTFIELDS => 'POST raw request content',
]);

$response = curl_exec($curlHandler);

curl_close($curlHandler);

echo($response);

Code source

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.