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?

L'inconnu
la source

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);
L'inconnu
la source
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

Serhii Andriichuk
la source