POST RAW utilizando cURL en PHP

126

¿Cómo puedo hacer una PUBLICACIÓN EN RAW en PHP usando cURL?

Publicación sin procesar como sin ninguna codificación, y mis datos se almacenan en una cadena. Los datos deben formatearse así:

... 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

Una opción es escribir manualmente todo el encabezado HTTP que se envía, pero eso parece menos óptimo.

De todos modos, ¿puedo pasar opciones a curl_setopt () que dicen usar POST, usar text / plain y enviar los datos sin formato desde a $variable?

El desconocido
fuente

Respuestas:

229

Encontré la solución, respondiendo a mi propia pregunta en caso de que alguien más se tope con ella.

$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);
El desconocido
fuente
44
¿php configurará el encabezado de longitud de contenido para usted o debería configurarlo también?
Eric Bloch
3
No puedo hacer que esto funcione en absoluto. Tengo una página en la que intento publicar datos sin procesar. Esa página registra todos los datos sin procesar que recibe en una tabla de base de datos. No hay nuevas filas en absoluto. ¿Sabes si algo ha cambiado aquí desde el '09?
James
1
Esto funciona para mí, sin especificar ningún encabezado HTTP.
xryl669
12
Me acabo de dar cuenta de que el cuerpo aquí puede incluir cualquier cadena json válida.
shasi kanth
1
Hay un límite de 2G para esta publicación en bruto. Si intenta enviar un archivo mayor que 2G, se truncarán nuevamente a 2G. Es una limitación del tipo de cadena que se está cargando.
Kaden Yealy
5

Implementación con la biblioteca 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()
);

Extensión 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);

Código fuente

Serhii Andriichuk
fuente