向PHP Curl资源添加选项

时间:2018-08-12 15:58:42

标签: php curl

我使用api的说明提供了两种选择。 一个需要zipCode输入,而一个则不需要。 使用PHP,对于使用zipCode的情况,但未省略zipCode的情况,我已经使用curl_setop成功构建了curl资源。没有zipCode的情况在URL后面应该有一个额外的选择。

我得到的指示只是卷曲应该像:

curl -i -X POST -H "Content-Type:application/json" -H "authToken:12345" https://connect.apisite.com/api/v1/users -d'
[{
"firstName": "John",
"lastName": "Smith",
"emailAddress": {
"address": "johnsmith@test.com"
}
}]'

对于没有邮政编码的情况 并使用zipCode

curl -i -X POST -H "Content-Type:application/json" -H 
"authToken:12345" https://connect.apisite.com/api/v1/users '
[{
"firstName": "John",
"lastName": "Smith",
"emailAddress": { "address": "johnsmith@test.com" },
"homeAddress" : { "postalCode" : "48124" }
}
}]'

我的问题是我不知道如何将-d添加到URL后面第一种情况下出现的curl资源中 这对我有用:

$url = "https://connect.apisite.com/api/v1/users";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');

$request_headers = array();
$request_headers[] = 'authToken: ' . $authResponse;
$request_headers[] = 'Content-Type: application/json';
curl_setopt($ch, CURLOPT_HTTPHEADER, $request_headers);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);

$response = curl_exec($ch);

我尝试将-d附加到URL上

$url = "https://connect.apisite.com/api/v1/users  -d";

那行不通。

我的猜测是我需要像这样使用一个常量

curl_setop($ch, CURLOPT_XXXXX, '-d');

但我不知道CURLOPT_XXXX应该是什么。 任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:0)

我不确定您为什么使用curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');,因为您的通话结构似乎可以通过常规的POST通话来完成,该通话可以通过以下方式处理:

curl_setopt(CURLOPT_POST, true);

会依次根据PHP文档调用cURL的-d标志:

  

CURLOPT_POST :如果为TRUE,则执行常规HTTP POST。该POST是普通的application/x-www-form-urlencoded类型,最常用于HTML表单。

此外,您需要更改curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);,因为这样做会使cURL以multipart/form-data的形式传递数据。而是将您的数据构造为URL编码的字符串,例如

curl_setopt($ch, CURLOPT_POSTFIELDS, urlencode(json_encode($postData)));

注意:我没有测试上面的后一行,但是您可以测试它并根据您的要求进行调整),根据PHP文档说明:

  

注意:

     

将数组传递给 CURLOPT_POSTFIELDS 会将数据编码为multipart / form-data,而传递URL编码的字符串会将数据编码为application / x-www-form-urlencoded。

答案 1 :(得分:0)

感谢大家的帮助和建议。

如前所述,我不需要执行任何操作即可添加-d

我得到了我需要使用postData的响应 $ postData = json_encode(array(array('(emailAddress'=> $ emailObj,'firstName'=> $ firstName,'lastName'=> $ lastName))));

$ postData = json_encode(array(array('(emailAddress'=> $ emailObj,'firstName'=> $ firstName,'lastName'=> $ lastName,'homePostalAddress'=> $ homePostalObj))));

答案 2 :(得分:-1)

在两个请求中,方法均为POST,如先前的回答,您可以设置CURLOPT_POST选项。我看到的唯一区别是发送的数据不同,一个不带zipCode,另一个不带zipCode。因此,您可以在包含zipCode之前准备数据,也可以不在数据数组中准备。您可以尝试以下类似方法。

    $dataRequest = [
                'firstName'    => "John",
                'lastName'     => "Smith",
                'emailAddress'    => [
                    'address' => 'johnsmith@test.com'
                ],
                'homeAddress' => [ //dont send this key in the case you dont want zipCode in the request.
                    'postalCode'=> '48124'
                ],
            ];
$url = "https://connect.apisite.com/api/v1/users";
$authToken = '12345';

$ch   = curl_init();
/**
the idea with urldecode is because some api does not accept the 
encoded urls in your case is not important due your data does not 
contains any url but if tomorrow you want to include smth like 
'customerUrl'=>'https://myhomepage.com' the result of http_build_query 
will be like 'https%3A%2F%2Fmyhomepage.com'
*/
$data = urldecode(http_build_query($dataRequest));
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_USERPWD, "{$authToken}:");

$headers   = [];
$headers[] = 'Content-Type: application/x-www-form-urlencoded';
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

$response = curl_exec($ch);
if (!curl_errno($ch)) {
/**
HANDLE RESPONSE, CHECK FOR PROPER HTTP CODE DEPENDING OF THE API RESPONSE, 
IN YOUR CASE I GUESS IS CREATE USER YOUR GOAL, SO MAYBE RESPONSE IS 'HTTP_CREATED'
BUT IF THIS FUNCTION WILL BE GENERIC BETTER SWITCH LIKE THIS:

switch ($http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE)) {
    case Response::HTTP_OK:
    case Response::HTTP_CREATED:
    case Response::HTTP_ACCEPTED:
        $response = json_decode($response, true);
        break;
    default:
        $response = [];
}
*/       
}
curl_close($ch);

return $response;

此示例的内容类型不是json格式,如果需要api,则可以更改它。