使用RESTful API(用于Rackspace的域记录API),我第一次遇到了一些问题。也就是说,将请求作为JSON文件发送,而不是通常的键值配对数据。
在我的情况下,我应该发送一个JSON格式的字符串,没有与之对应的键。我在cURL中遇到的所有示例总是假设请求页面需要一个。此外,似乎CURLOPT_POSTFIELDS
选项需要一个数组(读取:键值对),无论如何。
我可以设置必要的标头(Content-Type和其他身份验证标头),但我严重依赖于在请求中添加必要的JSON字符串。
我该怎么做?
修改
以下是API文档:
POST https://dns.api.rackspacecloud.com/v1.0/1234/domains/2725233/records
Accept: application/json
X-Auth-Token: ea85e6ac-baff-4a6c-bf43-848020ea3812
Content-Type: application/json
Content-Length: 725
{
"records" : [ {
"name" : "ftp.example.com",
"type" : "A",
"data" : "192.0.2.8",
"ttl" : 5771
}, {
"name" : "example.com",
"type" : "A",
"data" : "192.0.2.17",
"ttl" : 86400
}, {
"name" : "example.com",
"type" : "NS",
"data" : "dns1.stabletransit.com",
"ttl" : 3600
}, {
"name" : "example.com",
"type" : "NS",
"data" : "dns2.stabletransit.com",
"ttl" : 3600
}, {
"name" : "example.com",
"priority" : 5,
"type" : "MX",
"data" : "mail.example.com",
"ttl" : 3600
}, {
"name" : "www.example.com",
"type" : "CNAME",
"comment" : "This is a comment on the CNAME record",
"data" : "example.com",
"ttl" : 5400
} ]
}
答案 0 :(得分:0)
JSON格式打算使用key:value格式。另一方面,HTTP GET / POST协议也以密钥/值格式工作。应指定参数名称,以便侦听器能够通过按键获取值来准备值。
答案 1 :(得分:0)
假设您正在发布文件:
$fh = fopen('/path/to/file', 'r');
$ch = curl_init($url);
curl_setopt_array($ch, array(
CURLOPT_INFILE => $fh,
CURLOPT_POST => TRUE,
//...any other options you might need
));
curl_exec($ch);
curl_close($ch);
如果POSTing数据(如json)使用CURLOPT_POSTFIELDS
$data = '{ "foo": "bar" }';
curl_setopt_array($ch, array(
CURLOPT_POSTFIELDS => $data,
CURLOPT_POST => TRUE,
//...any other options you might need
));
答案 2 :(得分:0)
我写了一个类就是这样......它基本上只是一个卷曲包装器。但我清理了它,所以很容易改变标题,请求参数,请求正文等。
以下是一些如何入门的示例代码:
https://github.com/homer6/altumo/blob/master/source/php/Http/OutgoingHttpRequest.md
//prepare the message body
$record = new \stdClass();
$record->name = 'ftp.example.com';
$record->type = 'A';
$record->data = '192.0.2.8';
$record->ttl = 5771;
$message_body = new \stdClass();
$message_body->records = array(
$record
);
$json_string = json_encode( $message_body );
//send the request and get the response
$client = new \Altumo\Http\OutgoingHttpRequest( 'https://dns.api.rackspacecloud.com/v1.0/1234/domains/2725233/records' );
$client->setRequestMethod( \Altumo\Http\OutgoingHttpRequest::HTTP_METHOD_POST );
$client->addHeader( 'Accept', 'application/json' );
$client->addHeader( 'X-Auth-Token', 'ea85e6ac-baff-4a6c-bf43-848020ea3812' );
$client->addHeader( 'Content-Type', 'application/json' );
$client->setMessageBody( $json_string );
$response_string = $client->send();
//do something with the response
$response = json_decode( $response_string );
if( $response === false ){
throw new \Exception( 'Invalid JSON response.' );
}
$value = $response->one; //or whatever the response values are
请注意,OutgoingHttpRequest方法可能会抛出异常,因此您可能希望将其包装在try / catch中。我已经尽力记录下来,但如果我错过了什么,请告诉我。如果事情不清楚,我也可以提问。
我认为Zend构建了一个类似的HTTP包装器,如果这更像你的风格:
http://framework.zend.com/manual/en/zend.http.html
希望有帮助...