PHP GuzzleHttp。パラメータを使用して投稿リクエストを行う方法は?


100

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'とメッセージ 'No method can handle handle the email config key'が表示される

回答:


92

これを試して

$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
このメソッドは6.0で廃止されました。「body」の代わりに「form_params」を使用します。
jasonlfunk 2015

5
POSTリクエストを送信するための「body」リクエストオプションを配列として渡すことは非推奨になりました。「form_params」リクエストオプションを使用してapplication / x-www-form-urlencodedリクエストを送信するか、「multipart」リクエストオプションを使用してmultipart / form-dataリクエストを送信してください。
Jeremy Quinton

@JeremyQuinton、その代わりに選択したもの...返信してください
Madhur

@madhur以下の答えを見てください
Jeremy Quinton

応答を編集して、この「このメソッドは6.0で廃止されました。「body」の代わりに「form_params」を使用してください」を追加してください
a828h

181

以来マルコの答えは廃止され、あなたは(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'
        ]
    ]
]);

paramsでのREST動詞の使用法

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

非同期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、2016年

何探してんのさ ?クエリ文字列はURLの一部である場合は、次のようなURLに直接追加する必要がありexample.com/user/create?mode=dev
サミュエルDauzon

URLエンコードされたデータを使用して、paypalにポストリクエストを送信しようとしています。その['body']キーだと思います。
Raheel、2016年

postリクエストでクエリ文字列を送信するには、params内の 'query'オプションを使用する方がよいことがわかりました。これは、URL文字列では最初の1つだけが必要だったためです。クエリ
marcostvz 2016年

1
@ clockw0rk HTTPヘッダー部分を追加しました。あなたはドキュメントへのリンクを持っています
Samuel Dauzon

37

Guzzle V6.0以降では、次のエラーが発生する別の原因として、配列としてのJSONの誤った使用が考えられます。

POSTリクエストを送信するための「body」リクエストオプションを配列として渡すことは非推奨になりました。「form_params」リクエストオプションを使用してapplication / x-www-form-urlencodedリクエストを送信するか、「multipart」リクエストオプションを使用してmultipart / form-dataリクエストを送信してください。

不正

$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.cafilephp.ini、ファイル

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.