PHP GuzzleHttp. จะขอโพสต์ด้วย params ได้อย่างไร?


107

วิธีสร้างคำขอโพสต์ด้วย GuzzleHttp (เวอร์ชัน 5.0)

ฉันกำลังพยายามทำสิ่งต่อไปนี้:

$client = new \GuzzleHttp\Client();
$client->post(
    'http://www.example.com/user/create',
    array(
        'email' => 'test@gmail.com',
        'name' => 'Test user',
        'password' => 'testpassword'
    )
);

แต่ฉันได้รับข้อผิดพลาด:

ข้อผิดพลาดร้ายแรงของ PHP: ข้อยกเว้นที่ไม่ถูกจับ 'InvalidArgumentException' พร้อมข้อความ 'ไม่มีวิธีใดที่สามารถจัดการกับคีย์การกำหนดค่าอีเมลได้'

คำตอบ:


97

ลองทำตามนี้

$client = new \GuzzleHttp\Client();
$client->post(
    'http://www.example.com/user/create',
    array(
        'form_params' => array(
            'email' => 'test@gmail.com',
            'name' => 'Test user',
            'password' => 'testpassword'
        )
    )
);

92
วิธีนี้เลิกใช้แล้วใน 6.0 แทนที่จะใช้ "body" ให้ใช้ "form_params"
jasonlfunk

5
การส่งผ่านในอ็อพชันคำขอ "body" เป็นอาร์เรย์เพื่อส่งคำขอ POST ถูกเลิกใช้แล้ว โปรดใช้ตัวเลือกการร้องขอ "form_params" เพื่อส่งคำขอแอปพลิเคชัน / x-www-form-urlencoded หรือตัวเลือกคำขอ "หลายส่วน" เพื่อส่งคำขอหลายส่วน / แบบฟอร์มข้อมูล
Jeremy Quinton

@JeremyQuinton ดังนั้นสิ่งที่คุณเลือกตั้งใจไว้ ... โปรดตอบกลับ
Madhur

@madhur ดูคำตอบด้านล่าง
Jeremy Quinton

โปรดแก้ไขคำตอบและเพิ่ม "วิธีนี้เลิกใช้แล้วใน 6.0 ตอนนี้แทนที่จะใช้" body "ใช้" form_params ""
a828h

189

เนื่องจากคำตอบของ Marco เลิกใช้แล้วคุณต้องใช้ไวยากรณ์ต่อไปนี้ (ตามความคิดเห็นของ jasonlfunk):

$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'http://www.example.com/user/create', [
    'form_params' => [
        'email' => 'test@gmail.com',
        'name' => 'Test user',
        'password' => 'testpassword',
    ]
]);

ขอด้วยไฟล์ POST

$response = $client->request('POST', 'http://www.example.com/files/post', [
    'multipart' => [
        [
            'name'     => 'file_name',
            'contents' => fopen('/path/to/file', 'r')
        ],
        [
            'name'     => 'csv_header',
            'contents' => 'First Name, Last Name, Username',
            'filename' => 'csv_header.csv'
        ]
    ]
]);

การใช้คำกริยา REST กับ params

// PUT
$client->put('http://www.example.com/user/4', [
    'body' => [
        'email' => 'test@gmail.com',
        'name' => 'Test user',
        'password' => 'testpassword',
    ],
    'timeout' => 5
]);

// DELETE
$client->delete('http://www.example.com/user');

ข้อมูล Async POST

มีประโยชน์สำหรับการทำงานของเซิร์ฟเวอร์ที่ยาวนาน

$client = new \GuzzleHttp\Client();
$promise = $client->requestAsync('POST', 'http://www.example.com/user/create', [
    'form_params' => [
        'email' => 'test@gmail.com',
        'name' => 'Test user',
        'password' => 'testpassword',
    ]
]);
$promise->then(
    function (ResponseInterface $res) {
        echo $res->getStatusCode() . "\n";
    },
    function (RequestException $e) {
        echo $e->getMessage() . "\n";
        echo $e->getRequest()->getMethod();
    }
);

ตั้งค่าส่วนหัว

ตามเอกสารประกอบคุณสามารถตั้งค่าส่วนหัว:

// Set various headers on a request
$client->request('GET', '/get', [
    'headers' => [
        'User-Agent' => 'testing/1.0',
        'Accept'     => 'application/json',
        'X-Foo'      => ['Bar', 'Baz']
    ]
]);

ข้อมูลเพิ่มเติมสำหรับการดีบัก

หากคุณต้องการข้อมูลรายละเอียดเพิ่มเติมคุณสามารถใช้debugตัวเลือกนี้:

$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'http://www.example.com/user/create', [
    'form_params' => [
        'email' => 'test@gmail.com',
        'name' => 'Test user',
        'password' => 'testpassword',
    ],
    // If you want more informations during request
    'debug' => true
]);

เอกสารมีความชัดเจนมากขึ้นเกี่ยวกับความเป็นไปได้ใหม่ ๆ


ฉันจะส่งสตริงข้อความค้นหาในคำขอโพสต์ได้อย่างไร
Raheel

คุณกำลังมองหาอะไร? ถ้าสตริงแบบสอบถามเป็นส่วนหนึ่งของ URL ที่คุณต้องเพิ่มโดยตรงมันใน URL เช่นexample.com/user/create?mode=dev " .
ซามูเอล Dauzon

ฉันพยายามส่งคำขอโพสต์ไปยัง paypal ด้วยข้อมูลที่เข้ารหัส url ฉันคิดว่าคีย์ ['body'] ของมัน
Raheel

ในการส่งสตริงข้อความค้นหาในคำขอโพสต์ฉันพบว่าดีกว่าโดยใช้ตัวเลือก 'เคียวรี' ในพารามิเตอร์เนื่องจากในสตริง url ใช้เพียงตัวแรกเท่านั้น docs.guzzlephp.org/en/latest/request-options.html# สอบถาม
marcostvz

1
@ clockw0rk ฉันเพิ่มส่วนหัว HTTP ให้คุณแล้ว คุณมีลิงก์ไปยังเอกสาร
Samuel Dauzon

38

หมายเหตุใน Guzzle V6.0 + แหล่งที่มาอื่นของการรับข้อผิดพลาดต่อไปนี้อาจเป็นการใช้ JSON เป็นอาร์เรย์อย่างไม่ถูกต้อง:

การส่งผ่านในตัวเลือกคำขอ "body" เป็นอาร์เรย์เพื่อส่งคำขอ POST ถูกเลิกใช้แล้ว โปรดใช้ตัวเลือกการร้องขอ "form_params" เพื่อส่งคำขอแอปพลิเคชัน / x-www-form-urlencoded หรือตัวเลือกคำขอ "หลายส่วน" เพื่อส่งคำขอหลายส่วน / แบบฟอร์มข้อมูล

ไม่ถูกต้อง :

$response = $client->post('http://example.com/api', [
    'body' => [
        'name' => 'Example name',
    ]
])

ถูกต้อง :

$response = $client->post('http://example.com/api', [
    'json' => [
        'name' => 'Example name',
    ]
])

ถูกต้อง :

$response = $client->post('http://example.com/api', [
    'headers' => ['Content-Type' => 'application/json'],
    'body' => json_encode([
        'name' => 'Example name',
    ])
])

1
$client = new \GuzzleHttp\Client();
$request = $client->post('http://demo.website.com/api', [
    'body' => json_encode($dataArray)
]);
$response = $request->getBody();

เพิ่ม

openssl.cafileในphp.iniไฟล์

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