Làm cách nào tôi có thể sử dụng Guheads để gửi yêu cầu POST trong JSON?


180

Có ai biết cách chính xác để postsử dụng JSON Guzzlekhông?

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

Tôi nhận được internal server errorphản hồi từ máy chủ. Nó hoạt động bằng Chrome Postman.


Yêu cầu có vẻ ổn ... bạn đã kiểm tra nội dung của $ _POST để chắc chắn rằng bạn thực sự có được các giá trị trước khi mã hóa chúng chưa? : var_dump ($ _ POST)
ylerjen

Theo tài liệu bây giờ, bạn chỉ có thể sử dụng những gì @dirlkiash đã nói , 'json' => $data: stackoverflow.com/a/44154428/842768
giovannipds

Câu trả lời:


262

Đối với Gu 5 và 6, bạn làm như thế này:

use GuzzleHttp\Client;

$client = new Client();

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

Tài liệu


13
Đây là cách làm đúng ( ví dụ chính thức ở đây )
Pierre de LESPINAY

5
Bạn nên sử dụng các RequestOptionshằng số cho các phím mảng tùy chọn ( GuzzleHttp\RequestOptions::JSONtrong trường hợp này) - nó giúp phát hiện lỗi chính tả dễ dàng hơn khi chúng đột nhiên trở thành thông báo thay vì chỉ các lỗi im lặng chờ gây rắc rối.
ksadowski

7
@MichalGallovic Cũng vậy. Mục đích để sử dụng hằng là để tránh lỗi chính tả. Sử dụng hằng số không tồn tại sẽ gây ra lỗi, nhưng gửi một tùy chọn vô dụng ( jssonví dụ) sẽ không gây ra bất kỳ lỗi nào và bạn có thể mất một thời gian để tìm lỗi đánh máy của mình.
zessx

1
Tôi đã tìm kiếm một giờ cho câu trả lời này. Tại sao điều này không có trong tài liệu (đặc biệt là hướng dẫn thiết lập nhanh)? Khùng!?!
Thứ bảy

1
@giovannipds GuheadsHttp \ RequestOptions :: JSON là bí danh của 'json', hoặc là tốt.
Michal Gallovic

44

Đối với Gu kiếm <= 4 :

Đó là một yêu cầu bài viết thô để đặt JSON vào phần thân đã giải quyết vấn đề

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

return $response;

8
Điều này không còn hoạt động với GuheadsHttp. @Charlie có câu trả lời đúng
hbt

Tôi nghĩ rằng chúng ta chỉ cần xác định phiên bản của Guheads trong câu hỏi.
Fabrice Kabongo

1
Nếu bạn muốn đặt tiêu đề loại nội dung trong Gu 6, bạn có thể làm như thế này:$client->post($url, ['body' => $string, 'headers' => ['Content-type' => 'application/json']]);
marcovtwout

Tôi đã thử điều này với Guheads3 không hoạt động ngay cả khi đó là cách được đề cập trong tài liệu: gu Muff3.readthedocs.io/http-client/ , tôi đã cố gắng giải quyết pb này nhưng vô ích
Hanane

Theo tài liệu bây giờ, bạn chỉ có thể sử dụng những gì @dirlkiash đã nói , 'json' => $data: stackoverflow.com/a/44154428/842768
giovannipds

42

Cách đơn giản và cơ bản (gu6):

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

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

Để có được mã trạng thái phản hồi và nội dung của cơ thể, tôi đã làm điều này:

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

2
Đây thực sự là một cách đơn giản và dễ dàng. Giải quyết vấn đề của tôi về việc thiết lập cơ thể và tiêu đề. Cảm ơn rất nhiều
Faisal Sarfraz

Câu trả lời này hoạt động với tôi khi câu trả lời được chấp nhận không.
vietnguyen09

32

Điều này làm việc cho tôi (sử dụng Gu 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
Điều này cũng đặt tiêu đề chính xác? Tôi nghĩ ['json' => $body]là cách tốt hơn ở đây, như được đề cập bởi câu trả lời của Michael.
Ja͢ck

1
$res->json();chỉ hoạt động trong Gu khó 5.3. Nó đã bị xóa trong v6.
David

1
David là chính xác. Điều này là do thực hiện PSR-7. Sử dụng json_decode()thay thế.
Andreas

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

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

return $response->getBody();

8

Điều này hoạt động với tôi với Guheads 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')
                                )
                    );

Theo các tài liệu hướng dẫn làm json_encode


7
use GuzzleHttp\Client;

$client = new Client();

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

Xem tài liệu .


2

Phiên bản Php: 5.6

Phiên bản Symfony: 2.3

Hướng dẫn: 5.0

Tôi đã có một kinh nghiệm gần đây về việc gửi json với Guheads. Tôi sử dụng Symfony 2.3 để phiên bản hướng dẫn của tôi có thể cũ hơn một chút.

Tôi cũng sẽ chỉ cho bạn cách sử dụng chế độ gỡ lỗi và bạn có thể xem yêu cầu trước khi gửi nó,

Khi tôi thực hiện yêu cầu như hình dưới đây đã nhận được phản hồi thành công;

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

Câu trả lời từ @ user3379466 có thể được thực hiện để hoạt động bằng cách cài đặt $datanhư sau:

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

Điều mà dự án của chúng tôi cần là chèn một biến vào một mảng bên trong chuỗi json, điều mà tôi đã làm như sau (trong trường hợp này giúp được bất cứ ai):

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

Vì vậy, với $existing_variable, giả sử, 90210, bạn nhận được:

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

Cũng đáng chú ý là bạn cũng có thể muốn thiết lập cũng 'Accept' => 'application/json'như trong trường hợp điểm cuối bạn đang quan tâm về loại điều đó.


Chỉ cần ngẩng cao đầu lên ... bạn có thể đơn giản hóa $databằng cách sử dụng json_encode:$data = json_encode(array('collection' => $existing_variable));
phpisuber01

0

@ user3379466 là chính xác, nhưng ở đây tôi viết lại đầy đủ:

-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;

--- Giải pháp cho * Gạc 6 * --- -package mà bạn cần:

 "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;

Cảm ơn bạn. Không thể tìm thấy bất kỳ giải pháp gu Muff3 nào ở bất kỳ nơi nào khác cho các dự án php5.3 cũ, muốn xem nó có khả năng phá vỡ dòng như gu gu6 của bạn không vì nó sẽ giúp tôi tiết kiệm rất nhiều thời gian.
taur

0

Câu trả lời trên không làm việc cho tôi bằng cách nào đó. Nhưng điều này làm việc tốt cho tôi.

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

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

0

Đơn giản chỉ cần sử dụng nó sẽ làm việc

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