向 PHP Curl 资源添加选项

问题描述 投票:0回答:3

我使用 api 的说明提供了两个选项。 一种需要输入邮政编码,另一种则不需要。 使用 PHP,我已成功使用curl_setop 构建了一个curl 资源,适用于使用zipCode 的情况,但不适用于省略zipCode 的情况。没有 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": "[email protected]"
}
}]'

对于没有邮政编码的情况 以及邮政编码

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": "[email protected]" },
"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 应该是什么。 任何帮助将不胜感激。

php curl
3个回答
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。


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)));

-1
投票

在这两个请求中,方法都是 POST,正如之前的答案,您可以设置 CURLOPT_POST 选项。 我发现唯一的不同是您发送的数据,一个没有邮政编码,另一个有邮政编码。因此,您可以在将 zipCode 包含或不包含在数据数组中之前准备数据。您可以尝试如下所示的操作。

    $dataRequest = [
                'firstName'    => "John",
                'lastName'     => "Smith",
                'emailAddress'    => [
                    'address' => '[email protected]'
                ],
                '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;

此示例的 content-type 不是 json 格式,如果 api 要求,您可以更改它。

© www.soinside.com 2019 - 2024. All rights reserved.