没有得到预期的 PHP cURL 响应
Not getting expected PHP cURL response
我有以下 PHP 代码:
<?php
$data = array("client_id" => "sipgate-app-web", "grant_type" => "password", "username" => "my_username", "password" => "my_password");
$data_string = json_encode($data);
$ch = curl_init('https://api.sipgate.com/login/sipgate-apps/protocol/openid-connect/token');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/x-www-form-urlencoded',
'Accept: application/json'
));
$result = curl_exec($ch);
echo $result;
?>
很遗憾,我没有收到预期的回复。我收到的回复是:
{"error":"invalid_request","error_description":"Missing form
parameter: grant_type"}
当使用像 https://onlinecurl.com 这样的在线 cURL 工具时,使用与我的 cURL 相同的数据(URL、header、数据) PHP 代码,我得到了正确的响应。这意味着,我的 PHP 代码有问题。我在 PHP 错误日志中没有收到任何错误。
手册说我必须使用下面的 cURL 代码:
curl \
--request POST \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header 'Accept: application/json' \
--data-urlencode "client_id=sipgate-app-web" \
--data-urlencode "grant_type=password" \
--data-urlencode "username=my_username" \
--data-urlencode "password=my_password" \
https://api.sipgate.com/login/sipgate-apps/protocol/openid-connect/token
因为我是 cURL 的新手,在谷歌搜索了很多之后,我不知道我做错了什么。
有人能帮帮我吗?
编辑: 你可以按原样测试我上面的 PHP 代码。如果代码正常运行,您应该得到以下响应:
{"error":"invalid_grant","error_description":"Invalid user
credentials"}
根据手册,您的请求需要包含 application/x-www-form-urlencoded
的 Content-Type
,如下所示:
key1=value1&key2=value2
因此您需要手动或使用 http_build_query
将数组转换为这样的字符串,如下所示:
$data_string = http_build_query( $data );
我正在使用以下 PHP CURL 使用 API 之一,试试这个并传递您的凭据,即 "your username" 和 "your password" 中的用户名和密码。
<?php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://api.sipgate.com/login/sipgate-apps/protocol/openid-
connect/token",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS =>"{\r\n\client_id:\"sipgate-app-
web\",\r\n\tgrant_type\"password\",\r\n\tusername:\"your
username\",\r\n\tpassword:\"your password\"\r\n}",
CURLOPT_HTTPHEADER => array(
"Accept: application/json",
"Content-Type: application/json"
),
));
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
} ?>
我有以下 PHP 代码:
<?php
$data = array("client_id" => "sipgate-app-web", "grant_type" => "password", "username" => "my_username", "password" => "my_password");
$data_string = json_encode($data);
$ch = curl_init('https://api.sipgate.com/login/sipgate-apps/protocol/openid-connect/token');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/x-www-form-urlencoded',
'Accept: application/json'
));
$result = curl_exec($ch);
echo $result;
?>
很遗憾,我没有收到预期的回复。我收到的回复是:
{"error":"invalid_request","error_description":"Missing form parameter: grant_type"}
当使用像 https://onlinecurl.com 这样的在线 cURL 工具时,使用与我的 cURL 相同的数据(URL、header、数据) PHP 代码,我得到了正确的响应。这意味着,我的 PHP 代码有问题。我在 PHP 错误日志中没有收到任何错误。
手册说我必须使用下面的 cURL 代码:
curl \
--request POST \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header 'Accept: application/json' \
--data-urlencode "client_id=sipgate-app-web" \
--data-urlencode "grant_type=password" \
--data-urlencode "username=my_username" \
--data-urlencode "password=my_password" \
https://api.sipgate.com/login/sipgate-apps/protocol/openid-connect/token
因为我是 cURL 的新手,在谷歌搜索了很多之后,我不知道我做错了什么。
有人能帮帮我吗?
编辑: 你可以按原样测试我上面的 PHP 代码。如果代码正常运行,您应该得到以下响应:
{"error":"invalid_grant","error_description":"Invalid user credentials"}
根据手册,您的请求需要包含 application/x-www-form-urlencoded
的 Content-Type
,如下所示:
key1=value1&key2=value2
因此您需要手动或使用 http_build_query
将数组转换为这样的字符串,如下所示:
$data_string = http_build_query( $data );
我正在使用以下 PHP CURL 使用 API 之一,试试这个并传递您的凭据,即 "your username" 和 "your password" 中的用户名和密码。
<?php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://api.sipgate.com/login/sipgate-apps/protocol/openid-
connect/token",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS =>"{\r\n\client_id:\"sipgate-app-
web\",\r\n\tgrant_type\"password\",\r\n\tusername:\"your
username\",\r\n\tpassword:\"your password\"\r\n}",
CURLOPT_HTTPHEADER => array(
"Accept: application/json",
"Content-Type: application/json"
),
));
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
} ?>