RAW POST โดยใช้ cURL ใน PHP


127

ฉันจะทำ RAW POST ใน PHP โดยใช้ cURL ได้อย่างไร

โพสต์ดิบเหมือนในโดยไม่มีการเข้ารหัสใด ๆ และข้อมูลของฉันถูกเก็บไว้ในสตริง ข้อมูลควรมีรูปแบบดังนี้:

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

ทางเลือกหนึ่งคือเขียนส่วนหัว HTTP ทั้งหมดที่ส่งด้วยตนเอง แต่ดูเหมือนว่าจะไม่เหมาะสม

อย่างไรก็ตามฉันสามารถส่งตัวเลือกไปยัง curl_setopt () ที่ระบุว่าใช้ POST ใช้ข้อความ / ธรรมดาและส่งข้อมูลดิบจาก a $variable?

คำตอบ:


230

ฉันเพิ่งค้นพบวิธีแก้ปัญหาแบบที่ตอบคำถามของตัวเองเผื่อว่าจะมีใครสะดุด

$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 จะตั้งค่าส่วนหัวความยาวเนื้อหาให้คุณหรือคุณควรตั้งค่านั้นด้วย?
Eric Bloch

3
ฉันไม่สามารถทำงานนี้ได้เลย ฉันมีเพจที่พยายามโพสต์ข้อมูลดิบ หน้านั้นบันทึกข้อมูลดิบทั้งหมดที่ได้รับลงในตารางฐานข้อมูล ไม่มีแถวใหม่เลย คุณรู้ไหมว่ามีอะไรเปลี่ยนแปลงที่นี่ตั้งแต่ปี '09?
James

1
สิ่งนี้ใช้ได้กับฉันโดยไม่ต้องระบุส่วนหัว HTTP ใด ๆ
xryl669

12
ฉันเพิ่งรู้ว่าbody ไปที่นี่สามารถรวมสตริง json ที่ถูกต้องได้
shasi kanth

2
โพสต์ดิบนี้มีขีด จำกัด 2G หากคุณพยายามส่งไฟล์ที่มีขนาดใหญ่กว่า 2G ไฟล์เหล่านั้นจะถูกตัดกลับไปที่ 2G เป็นข้อ จำกัด ของประเภทสตริงที่กำลังโหลด
Kaden Yealy

5

การใช้งานกับห้องสมุด 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()
);

นามสกุล 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);

รหัสแหล่งที่มา

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.