使用PHP cURL发送非键值对POST请求?

时间:2011-11-12 15:36:20

标签: php json http post curl

使用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
  } ]
}

3 个答案:

答案 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

希望有帮助...