PHP GuzzleHttp. Params ile gönderi talebi nasıl yapılır?


107

GuzzleHttp (sürüm 5.0) ile gönderi isteği nasıl yapılır.

Aşağıdakileri yapmaya çalışıyorum:

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

Ama şu hatayı alıyorum:

PHP Ölümcül hatası: 'E-posta yapılandırma anahtarını hiçbir yöntem işleyemez' mesajıyla birlikte yakalanmamış 'InvalidArgumentException' istisnası

Yanıtlar:


97

Bunu dene

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

92
Bu yöntem artık 6.0'da kullanımdan kaldırılmıştır. 'Body' yerine 'form_params' kullanın.
jasonlfunk

5
POST isteği göndermek için "body" istek seçeneğinin bir dizi olarak aktarılması kullanımdan kaldırıldı. Lütfen bir uygulama / x-www-form-urlencoded isteği göndermek için "form_params" istek seçeneğini veya çok parçalı / form veri isteği göndermek için "çok parçalı" bir istek seçeneğini kullanın.
Jeremy Quinton

@JeremyQuinton, peki bunun yerine ne seçtiniz ... lütfen cevap verin
Madhur

@madhur aşağıdaki cevaba bak
Jeremy Quinton

lütfen yanıtı düzenleyin ve buna "Bu yöntem 6.0'da kullanımdan kaldırıldı. 'body' yerine 'form_params' kullanın" - buna
ekleyin

189

Yana Marco'nun cevabı itiraz edildi , aşağıdaki sözdizimini (jasonlfunk yorumuna göre) kullanmalıdır:

$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 dosyalarıyla istek

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

Parametreler ile REST fiil kullanımı

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

Eşzamansız POST verileri

Uzun sunucu işlemleri için kullanışlıdır.

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

Başlıkları ayarla

Belgelere göre , başlıkları ayarlayabilirsiniz:

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

Hata ayıklama için daha fazla bilgi

Daha ayrıntılı bilgi istiyorsanız, aşağıdaki debuggibi seçenekleri kullanabilirsiniz :

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

Belgeleme , yeni olasılıklar hakkında daha fazla açıklıktır.


Gönderi talebinde sorgu dizesini nasıl gönderebilirim?
Raheel

Ne arıyorsun ? Sorgu dizesi URL'nin bir parçasıysa, onu ornek.com/user/create?mode=dev " gibi doğrudan URL'ye eklemeniz gerekir .
Samuel Dauzon

Url kodlu verilerle paypal'a posta isteği göndermeye çalışıyorum. Sanırım onun ['vücut'] anahtarı.
Raheel


1
@ clockw0rk Sizin için bir HTTP başlık bölümü ekledim.
Doküman

38

Guzzle V6.0 + sürümünde, aşağıdaki hatayı almanın başka bir kaynağı JSON'un dizi olarak yanlış kullanılması olabilir:

POST isteği göndermek için "body" istek seçeneğinin bir dizi olarak aktarılması kullanımdan kaldırıldı. Lütfen bir uygulama / x-www-form-urlencoded isteği göndermek için "form_params" istek seçeneğini veya çok parçalı / form-veri isteği göndermek için "çok parçalı" bir istek seçeneğini kullanın.

Yanlış :

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

Doğru :

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

Doğru :

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

Ekle

openssl.cafileiçinde php.inidosyanın

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.