PHP GuzzleHttp. Làm thế nào để thực hiện một yêu cầu bài đăng với params?


100

Cách thực hiện yêu cầu đăng bài với GuzzleHttp (phiên bản 5.0).

Tôi đang cố gắng thực hiện những điều sau:

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

Nhưng tôi gặp lỗi:

PHP Lỗi nghiêm trọng: Không có ngoại lệ 'InvalidArgumentException' với thông báo 'Không có phương pháp nào có thể xử lý khóa cấu hình email'

Câu trả lời:


92

Thử cái này

$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'
        )
    )
);

89
Phương pháp này hiện không được dùng nữa trong 6.0. Thay vì 'body', hãy sử dụng 'form_params'.
jasonlfunk

5
Việc chuyển vào tùy chọn yêu cầu "body" dưới dạng một mảng để gửi yêu cầu POST đã không được dùng nữa. Vui lòng sử dụng tùy chọn yêu cầu "form_params" để gửi yêu cầu ứng dụng / x-www-form-urlencoded hoặc tùy chọn yêu cầu "nhiều phần" để gửi yêu cầu nhiều phần / biểu mẫu-dữ liệu.
Jeremy Quinton

@JeremyQuinton, vì vậy những gì bạn đã chọn intead của mà ... vui lòng trả lời
Madhur

@madhur hãy xem câu trả lời bên dưới
Jeremy Quinton

vui lòng chỉnh sửa câu trả lời và thêm điều này "Phương pháp này hiện không được chấp nhận trong 6.0. Thay vì 'body', hãy sử dụng 'form_params'" vào nó
a828h 12/04/18

181

câu trả lời của Marco không được chấp nhận , bạn phải sử dụng cú pháp sau (theo bình luận của 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',
    ]
]);

Yêu cầu với các tệp ĐĂNG

$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'
        ]
    ]
]);

Cách sử dụng động từ REST với 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');

Không đồng bộ hóa dữ liệu POST

Hữu ích cho các hoạt động máy chủ dài.

$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();
    }
);

Đặt tiêu đề

Theo tài liệu , bạn có thể đặt tiêu đề:

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

Thêm thông tin để gỡ lỗi

Nếu bạn muốn biết thêm thông tin chi tiết, bạn có thể sử dụng debugtùy chọn như sau:

$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
]);

Tài liệu giải thích nhiều hơn về các khả năng mới.


Làm cách nào để gửi chuỗi truy vấn trong yêu cầu đăng bài?
Raheel

Bạn đang tìm gì Nếu chuỗi truy vấn là một phần của URL, bạn phải thêm trực tiếp chuỗi đó vào URL như example.com/user/create?mode=dev " .
Samuel Dauzon

Tôi đang cố gắng gửi yêu cầu bài đến paypal với dữ liệu được mã hóa url. Tôi nghĩ phím ['body'] của nó.
Raheel

Để gửi chuỗi truy vấn trong các yêu cầu bài đăng, tôi thấy tốt hơn bằng cách sử dụng tùy chọn 'query' bên trong các tham số, bởi vì bằng cách nào đó trong chuỗi url, nó chỉ lấy một docs.guzzlephp.org/en/latest/request-options.html# truy vấn
marcostvz

1
@ clockw0rk Tôi đã thêm một phần tiêu đề HTTP cho bạn. Bạn có liên kết đến tài liệu
Samuel Dauzon

37

Lưu ý trong Guzzle V6.0 +, một nguồn khác gây ra lỗi sau có thể do việc sử dụng JSON làm mảng không chính xác:

Việc chuyển vào tùy chọn yêu cầu "body" dưới dạng một mảng để gửi yêu cầu POST đã không được dùng nữa. Vui lòng sử dụng tùy chọn yêu cầu "form_params" để gửi một yêu cầu ứng dụng / x-www-form-urlencoded hoặc tùy chọn yêu cầu "nhiều phần" để gửi một yêu cầu nhiều phần / biểu mẫu-dữ liệu.

Không chính xác :

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

Đúng :

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

Đúng :

$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();

Thêm vào

openssl.cafiletrong php.inihồ sơ

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.