Guzzle을 사용하여 JSON으로 POST 요청을 보내려면 어떻게해야합니까?


180

누구든지 postJSON을 사용 하는 올바른 방법을 알고 Guzzle있습니까?

$request = $this->client->post(self::URL_REGISTER,array(
                'content-type' => 'application/json'
        ),array(json_encode($_POST)));

나는 얻을 internal server error서버에서 응답을. Chrome을 사용하여 작동합니다 Postman.


요청이 괜찮은 것 같습니다 ... 인코딩하기 전에 값을 실제로 얻었는지 확인하기 위해 $ _POST의 내용을 확인 했습니까? : var_dump ($ _ POST)
ylerjen

현재 문서에 따르면, 당신은 단지 @davykiash이 말을 사용할 수 있습니다 'json' => $data: stackoverflow.com/a/44154428/842768는
giovannipds

답변:


262

들어 목구멍 5, 6, 7 이처럼 수행

use GuzzleHttp\Client;

$client = new Client();

$response = $client->post('url', [
    GuzzleHttp\RequestOptions::JSON => ['foo' => 'bar'] // or 'json' => [...]
]);

문서


13
이것이 올바른 방법입니다 ( 공식적인 예 )
Pierre de LESPINAY

5
RequestOptions옵션 배열 키에 상수 를 사용하는 것이 좋습니다 ( GuzzleHttp\RequestOptions::JSON이 경우). 문제를 일으키기 위해 대기하는 자동 버그 대신 갑자기 알림으로 오타를 쉽게 감지 할 수 있습니다.
ksadowski

7
@MichalGallovic 동일합니다. 상수를 사용하는 목적은 오타를 피하는 것입니다. 존재하지 않는 상수를 사용하면 오류가 발생하지만 쓸모없는 옵션 ( jsson예 : 등)을 보내 도 오류가 발생하지 않으며 오타를 찾는 데 시간이 걸릴 수 있습니다.
zessx

1
나는이 답변을 위해 한 시간 동안 둘러보고있었습니다. 설명서에없는 이유는 무엇입니까 (특히 빠른 설정 안내서)? 미친!?!
Sevenearths 2014 년

1
@giovannipds GuzzleHttp \ RequestOptions :: JSON은 'json'의 별칭입니다.
Michal Gallovic

44

들면 폭식 <= 4 :

원시 게시물 요청이므로 JSON을 본문에 넣으면 문제가 해결되었습니다.

$request = $this->client->post($url,array(
                'content-type' => 'application/json'
        ),array());
$request->setBody($data); #set body!
$response = $request->send();

return $response;

8
더 이상 GuzzleHttp에서 작동하지 않습니다. @Charlie는 정답이
HBT

질문에 Guzzle의 버전을 지정해야한다고 생각합니다.
Fabrice Kabongo

1
Guzzle 6에서 컨텐츠 유형 헤더를 설정하려면 다음과 같이하십시오.$client->post($url, ['body' => $string, 'headers' => ['Content-type' => 'application/json']]);
marcovtwout

: 그것은이 문서에서 했나요 방식의 경우 나는 Guzzle3도 작동하지 않는 경우에 이것을 시도 guzzle3.readthedocs.io/http-client/...는 그것이 내가이 PB를 해결하기 위해 노력하고 이일하고 있지만 헛된 것,
하나 네

현재 문서에 따르면, 당신은 단지 @davykiash이 말을 사용할 수 있습니다 'json' => $data: stackoverflow.com/a/44154428/842768는
giovannipds

42

간단하고 기본적인 방법 (guzzle6) :

$client = new Client([
    'headers' => [ 'Content-Type' => 'application/json' ]
]);

$response = $client->post('http://api.com/CheckItOutNow',
    ['body' => json_encode(
        [
            'hello' => 'World'
        ]
    )]
);

응답 상태 코드와 본문 내용을 얻으려면 다음과 같이하십시오.

echo '<pre>' . var_export($response->getStatusCode(), true) . '</pre>';
echo '<pre>' . var_export($response->getBody()->getContents(), true) . '</pre>';

2
이것은 실제로 간단하고 쉬운 방법입니다. 본문 및 헤더 설정에 대한 내 문제를 해결했습니다. 대단히 감사합니다
Faisal Sarfraz

이 답변은 수락 된 답변이 그렇지 않을 때 효과적입니다.
vietnguyen09 2009 년

32

이것은 나를 위해 일했다 (Guzzle 6 사용)

$client = new Client(); 
$result = $client->post('http://api.example.com', [
            'json' => [
                'value_1' => 'number1',
                'Value_group' =>  
                             array("value_2" => "number2",
                                    "value_3" => "number3")
                    ]
                ]);

echo($result->getBody()->getContents());

25
$client = new \GuzzleHttp\Client();

$body['grant_type'] = "client_credentials";
$body['client_id'] = $this->client_id;
$body['client_secret'] = $this->client_secret;

$res = $client->post($url, [ 'body' => json_encode($body) ]);

$code = $res->getStatusCode();
$result = $res->json();

2
이것도 올바른 헤더를 설정합니까? ['json' => $body]Michael의 답변에서 언급했듯이 여기에 더 좋은 방법 이라고 생각 합니다.
Ja͢ck

1
$res->json();Guzzle 5.3에서만 작동합니다. v6에서 제거되었습니다.
David

1
다윗이 맞습니다. 이것은 PSR-7 구현 때문입니다. json_decode()대신 사용하십시오 .
Andreas

10
$client = new \GuzzleHttp\Client(['base_uri' => 'http://example.com/api']);

$response = $client->post('/save', [
    'json' => [
        'name' => 'John Doe'
    ]
]);

return $response->getBody();

8

이것은 Guzzle 6.2에서 작동합니다.

$gClient =  new \GuzzleHttp\Client(['base_uri' => 'www.foo.bar']);
$res = $gClient->post('ws/endpoint',
                            array(
                                'headers'=>array('Content-Type'=>'application/json'),
                                'json'=>array('someData'=>'xxxxx','moreData'=>'zzzzzzz')
                                )
                    );

문서 guzzle에 따르면 json_encode를 수행하십시오.


7
use GuzzleHttp\Client;

$client = new Client();

$response = $client->post('url', [
    'json' => ['foo' => 'bar']
]);

문서를 참조하십시오 .


2

PHP 버전 : 5.6

심포니 버전 : 2.3

구글 : 5.0

최근 Guzzle과 함께 json을 보내는 경험이있었습니다. 나는 Symfony 2.3을 사용하므로 guzzle 버전이 조금 더 오래 될 수 있습니다.

또한 디버그 모드를 사용하는 방법을 보여 드리며 요청을 보내기 전에 볼 수 있습니다.

아래에 표시된대로 요청을하면 성공적인 응답을 얻었습니다.

use GuzzleHttp\Client;

$headers = [
        'Authorization' => 'Bearer ' . $token,        
        'Accept'        => 'application/json',
        "Content-Type"  => "application/json"
    ];        

    $body = json_encode($requestBody);

    $client = new Client();    

    $client->setDefaultOption('headers', $headers);
    $client->setDefaultOption('verify', false);
    $client->setDefaultOption('debug', true);

    $response = $client->post($endPoint, array('body'=> $body));

    dump($response->getBody()->getContents());

0

@ user3379466의 답변은 $data다음과 같이 설정하여 작동하도록 할 수 있습니다 .

$data = "{'some_key' : 'some_value'}";

우리 프로젝트에서 필요한 것은 json 문자열 내부의 배열에 변수를 삽입하는 것이 었습니다.

$data = "{\"collection\" : [$existing_variable]}";

따라서 $existing_variable90210이되면 다음과 같은 이점이 있습니다.

echo $data;
//{"collection" : [90210]}

또한 주목해야 할 'Accept' => 'application/json'것은 엔드 포인트가 그런 종류의 일에 관심이있는 경우를 대비하여 설정할 수도 있다는 것입니다.


그냥 머리 위로 ... 당신은 다음 $data을 사용하여 단순화 할 수 있습니다 json_encode:$data = json_encode(array('collection' => $existing_variable));
phpisuber01

0

@ user3379466은 정확하지만 여기에서 완전히 다시 작성합니다.

-package that you need:

 "require": {
    "php"  : ">=5.3.9",
    "guzzlehttp/guzzle": "^3.8"
},

-php code (Digest is a type so pick different type if you need to, i have to include api server for authentication in this paragraph, some does not need to authenticate. If you use json you will need to replace any text 'xml' with 'json' and the data below should be a json string too):

$client = new Client('https://api.yourbaseapiserver.com/incidents.xml', array('version' => 'v1.3', 'request.options' => array('headers' => array('Accept' => 'application/vnd.yourbaseapiserver.v1.1+xml', 'Content-Type' => 'text/xml'), 'auth' => array('username@gmail.com', 'password', 'Digest'),)));

$url          = "https://api.yourbaseapiserver.com/incidents.xml";
        
$data = '<incident>
<name>Incident Title2a</name>
<priority>Medium</priority>
<requester><email>dsss@mail.ca</email></requester>
<description>description2a</description>
</incident>';

    $request = $client->post($url, array('content-type' => 'application/xml',));

    $request->setBody($data); #set body! this is body of request object and not a body field in the header section so don't be confused.

    $response = $request->send(); #you must do send() method!
    echo $response->getBody(); #you should see the response body from the server on success
    die;

--- * Guzzle 6 용 솔루션 * ----필요한 패키지 :

 "require": {
    "php"  : ">=5.5.0",
    "guzzlehttp/guzzle": "~6.0"
},

$client = new Client([
                             // Base URI is used with relative requests
                             'base_uri' => 'https://api.compay.com/',
                             // You can set any number of default request options.
                             'timeout'  => 3.0,
                             'auth'     => array('you@gmail.ca', 'dsfddfdfpassword', 'Digest'),
                             'headers' => array('Accept'        => 'application/vnd.comay.v1.1+xml',
                                                'Content-Type'  => 'text/xml'),
                         ]);

$url = "https://api.compay.com/cases.xml";
    $data string variable is defined same as above.


    // Provide the body as a string.
    $r = $client->request('POST', $url, [
        'body' => $data
    ]);

    echo $r->getBody();
    die;

감사합니다. 레거시 php5.3 프로젝트를위한 다른 곳에서는 guzzle3 솔루션을 찾을 수 없었습니다 .guzzle6이 시간을 많이 절약했기 때문에 guzzle6과 마찬가지로 줄 바꿈하고 싶습니다.
taur

0

위의 답변은 어떻게 든 나를 위해 작동하지 않았습니다. 그러나 이것은 나를 위해 잘 작동합니다.

 $client = new Client('' . $appUrl['scheme'] . '://' . $appUrl['host'] . '' . $appUrl['path']);

 $request = $client->post($base_url, array('content-type' => 'application/json'), json_encode($appUrl['query']));

0

이것을 사용하면 작동합니다.

   $auth = base64_encode('user:'.config('mailchimp.api_key'));
    //API URL
    $urll = "https://".config('mailchimp.data_center').".api.mailchimp.com/3.0/batches";
    //API authentication Header
    $headers = array(
        'Accept'     => 'application/json',
        'Authorization' => 'Basic '.$auth
    );
    $client = new Client();
    $req_Memeber = new Request('POST', $urll, $headers, $userlist);
    // promise
    $promise = $client->sendAsync($req_Memeber)->then(function ($res){
            echo "Synched";
        });
      $promise->wait();
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.