如何使用 Zend 2 http 发送 json 数据? [英] How do I send json data using Zend 2 http?

查看:21
本文介绍了如何使用 Zend 2 http 发送 json 数据?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经为此苦苦挣扎了几天 - 我需要将一组以 json 编码的数据发送到 api.我正在尝试使用 Zend 2 http 来实现这一点,但到目前为止我没有运气.这是 api 的手册所说的:

I've been struggling with this for a few days now - I need to send a set of data encoded in json to an api. I'm trying to use Zend 2 http to achieve this but I've had no luck so far. Here is what the manual for the api says :

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":""}]

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

Ok so that's what it expects and this is my code so far :-

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

这不起作用,我确定我遗漏了 - 这是我在启动该脚本时遇到的错误:-

That's not working and I'm sure there's I'm missing - here are the errors I get when I fire that script : -

[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 

您可以提供任何帮助或帮助我将不胜感激:)

Any light you can shed or help you can give me would be greatly appreciated :)

提前致谢

推荐答案

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

You need to set the enc type when adding post data to the request object (this isn't very clear in the docs). Also, the example from the API manual implies that it's only the contacts that need to be JSON, you've encoded the whole array.

试试这个:

$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 客户端需要您的网络服务器上的 CA 证书的路径.

Edit: In order to verify that the SSL certificate is valid, the HTTP client needs the path to the CA certificates on your web server.

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

You pass this in as a config option to the Http client instance:

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

这是 Ubuntu 上的路径,您需要找出它适用于您的服务器.

That's the path on Ubuntu, you'll need to find out what it is for your server.

这篇关于如何使用 Zend 2 http 发送 json 数据?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆