PHP GuzzleHttp. params로 포스트 요청을 만드는 방법은 무엇입니까?


100

GuzzleHttp (version 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 치명적인 오류 : 'No method can handle the email config key'메시지와 함께 포착되지 않은 예외 'InvalidArgumentException'

답변:


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

5
POST 요청을 보내기 위해 "body"요청 옵션을 배열로 전달하는 것은 더 이상 사용되지 않습니다. "form_params"요청 옵션을 사용하여 application / x-www-form-urlencoded 요청을 보내거나 "multipart"요청 옵션을 사용하여 multipart / form-data 요청을 보내십시오.
제레미 퀸튼

@JeremyQuinton, 당신은 intead 그 선택한 항목 그래서 ... 회신 해 주시기 바랍니다
Madhur

답은 아래에 @madhur보기
제레미 퀸튼

응답을 편집하고 "이 메소드는 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'
        ]
    ]
]);

매개 변수를 사용한 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

무엇을 찾고 있습니까? 쿼리 문자열이 URL의 일부인 경우 example.com/user/create?mode=dev " 와 같은 URL에 직접 추가해야합니다 .
Samuel Dauzon

URL 인코딩 데이터로 페이팔에 게시물 요청을 보내려고합니다. 나는 그것의 [ 'body'] 키를 생각한다.
Raheel

게시물 요청에서 쿼리 문자열을 보내려면 params 내부의 'query'옵션을 사용하는 것이 더 나은 것으로 나타났습니다. url 문자열에서 어떻게 든 첫 번째 docs.guzzlephp.org/en/latest/request-options.html# 쿼리
marcostvz

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.