如何使用Zend 2 http发送json数据?

时间:2013-10-24 08:44:52

标签: php json zend-framework2

我几天来一直在努力解决这个问题 - 我需要将一组用json编码的数据发送到api。我正在尝试使用Zend 2 http来实现这一目标,但到目前为止我还没有运气。以下是api的手册:

Bulk Create Contacts
This command can be used to insert new numbers into your Textlocal contact groups 
and  will allow you to insert extra fields such as the contact's name.

Parameter   Description
group_id    ID of the group you’d like to store the numbers in. This
contacts    A JSON object containing all the details for each contact.

Note: It is recommended to send this request via POST.

Sample Request
(POST Variables): 
username: testing@Textlocal.co.uk 
hash: 4c0d2b951ffabd6f9a10489dc40fc356ec1d26d5 
group_id: 5 
contacts: [{"number":"447123456789","first_name":"Bob","last_name":"Smith","custom1":"","custom2":"","custom3":""},{"number":"447987654321","first_name":"Sally","last_name":"McKenzie","custom1":"","custom2":"","custom3":""},{"number":"447000000000","first_name":"Ramesh","last_name":"Dewani","custom1":"","custom2":"","custom3":""}]

好的,这就是它所期望的,这是我目前的代码: -

include 'Zend/Loader/StandardAutoloader.php';
$loader = new Zend\Loader\StandardAutoloader(array('autoregister_zf' => true));
$loader->register();

use Zend\Http\Client;
use Zend\Http\Request;

$data = array(
'username'      => 'myUsername',
'hash'    => 'myHash',
'group_id'       => 123456,
'contacts' => json_encode(array('number'=>447123456789,'first_name'=>'Bob','last_name'=>'Smith','custom1'=>"",'custom2'=>"","custom3"=>""))
);


$uri = 'https://api.txtlocal.com/create_contacts_bulk';
$request = new Request();
$request->setUri($uri);
$request->setMethod('POST');
$request->getPost()->set($data);

    $config = array(
                'adapter' => 'Zend\Http\Client\Adapter\Socket',
                'ssltransport' => 'ssl',
                'sslcert' => '/etc/pki/tls/cert.pem',
                'sslcapath' => '/etc/pki/tls/certs'
                );

$client = new Client(null, $config);
$client->setEncType(Client::ENC_FORMDATA);
$response = $client->dispatch($request);

if ($response->isSuccess()) {
echo "the post worked!";
}else{
echo "the post failed";
}

这不起作用,我确信我错过了 - 这是我解雇该脚本时遇到的错误: -

[Thu Oct 24 09:29:47 2013] [error] [client] PHP Warning: Missing argument 2 for Zend\\Stdlib\\Parameters::set(), called in zend_test.php on line 24 and defined in Zend/Stdlib/Parameters.php on line 110
[Thu Oct 24 09:29:47 2013] [error] [client] PHP Notice: Undefined variable: value in Zend/Stdlib/Parameters.php on line 112
[Thu Oct 24 09:29:47 2013] [error] [client] PHP Fatal error: Uncaught exception 'Zend\\Http\\Client\\Exception\\RuntimeException' with message 'Cannot handle content type '' automatically' in Zend/Http/Client.php:1218\nStack trace:\n#0 Zend/Http/Client.php(858): Zend\\Http\\Client->prepareBody()\n#1 Zend/Http/Client.php(798): Zend\\Http\\Client->send(Object(Zend\\Http\\Request))\n#2 zend_test.php(30): Zend\\Http\\Client->dispatch(Object(Zend\\Http\\Request))\n#3 {main}\n thrown in Zend/Http/Client.php on line 1218 

你可以放弃或帮助你的任何光线都会非常感激:)

提前致谢

2 个答案:

答案 0 :(得分:8)

在将后期数据添加到请求对象时,您需要设置enc类型(这在文档中不是很清楚)。此外,API手册中的示例暗示只有联系人需要是JSON,您已经编码了整个数组。

试试这个:

$data = array(
    'username' => 'myUsername',
    'hash' => 'myHash',
    'group_id' => 123456,
    'contacts' => json_encode(array('number'=>447123456789,'first_name'=>'Bob','last_name'=>'Smith','custom1'=>"",'custom2'=>"","custom3"=>""))
);

$request = new Request();
$request->setUri('https://api.txtlocal.com/create_contacts_bulk');
$request->setMethod('POST');
$request->getPost()->fromArray($data);

$client = new Client();
$client->setEncType(Client::ENC_FORMDATA);
$response = $client->dispatch($request);

if ($response->isSuccess()) {
    echo "the post worked!";
}else{
    echo "the post failed";
}

编辑:为了验证SSL证书是否有效,HTTP客户端需要Web服务器上CA证书的路径。

您将此作为配置选项传递给Http客户端实例:

$client = new Client(null, array(
    'sslcapath' => '/etc/ssl/certs'
));

这是Ubuntu上的路径,你需要找出它对你的服务器是什么。

答案 1 :(得分:2)

顺便说一句,请不要使用Request,Response和Client类的长构造,而应该使用静态客户端:

http://framework.zend.com/manual/2.0/en/modules/zend.http.client-static.html

use Zend\Http\ClientStatic;

// Simple GET request
$response = ClientStatic::get('http://example.org');

// More complex GET request, specifying query string 'foo=bar' and adding a
// custom header to request JSON data be returned (Accept: application/json)
$response = ClientStatic::get(
    'http://example.org',
    array( 'foo' => 'bar' ),
    array( 'Accept' => 'application/json')
);

// We can also do a POST request using the same format.  Here we POST
// login credentials (username/password) to a login page:
$response = ClientStatic::post('https://example.org/login.php', array(
    'username' => 'foo',
    'password' => 'bar',
));