【发布时间】:2019-03-15 13:54:23
【问题描述】:
我正在尝试使用 cURL 发布到 API,但没有成功。我已经研究了 2 天了,但我似乎无法让它发挥作用。
这是一个 URL 示例,我可以将其粘贴到网络浏览器中,它可以正常工作,没问题:
http://{myserver}:{port}/api.aspx?Action=AddTicket&Key=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx&Subject=Test&Description=Test&Username={domain}\{username}
(我显然编辑了一些信息)。
我知道 cURL 是最新的并且可以在服务器上运行,因为我可以向 [http://www.google.com] 发出一个简单的请求,它会正确返回页面,我也已经确认了在 php.info 页面上显示为 ENABLED。
我已经尝试了所有可以找到的 cURL 代码布局,例如将 POSTFIELDS 设置为数组和字符串。我已经关注了多个 YouTube 视频和“T”的网络教程,但没有成功。我什至尝试将 $ch 中的 URL 参数设置为上面的整个 URL,只是为了它......没有成功。
任何人都可以解释或举例说明应该如何格式化,以便它简单地发布一个与上述相同的 URL 吗?
非常感谢!
根据要求,这是我的代码。
$url = 'http://{server}:{port}/api.aspx?Action=AddTicket';
$post_data = '&key=' . $key . '&subject=' . $subject . '&description=' . $details . '&username={domain}\{username}';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
$output = curl_exec($ch);
if ($output === false) {
echo "cURL Error: " . curl_error($ch);
}
curl_close($ch);
print_r($output);
这是我在 POSTFIELDS 中使用数组而不是字符串的尝试。
$url = 'http://{server}:{port}/api.aspx?Action=AddTicket';
$post_data = array(
'key' => $key,
'subject' => $subject,
'description' => $details,
'username' => '{domain}\{username}'
);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post_data));
$output = curl_exec($ch);
if ($output === false) {
echo "cURL Error: " . curl_error($ch);
}
curl_close($ch);
print_r($output);
编辑
我已经尝试了 cmets 中给出的一些示例。这是我目前正在运行的一个小测试。
$data = array(
'Action' => 'AddTicket',
'Key' => 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx',
'Subject' => 'test',
'Description' => 'test',
'Username' => '{domain}\{username}'
);
$query = http_build_query($data);
$url = 'http://{server}:{port}/api.aspx?' . $query;
print_r($url);
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_HTTPAUTH => CURLAUTH_ANY,
CURLOPT_URL => $url
));
$resp = curl_exec($curl);
curl_close($curl);
现在,如果我直接从上面的代码中获取 $url 变量并运行它...
header("Location:" . $url);
die();
它工作得很好......所以我的问题必须在 cURL 语法或参数中......
编辑
添加以下代码后...
var_dump($resp);
var_dump(curl_getinfo($curl, CURLINFO_HTTP_CODE));
var_dump(curl_error($curl));
我得到以下结果...
string(0) ""
int(401)
string(0) ""
有人知道这是什么意思吗?
【问题讨论】:
-
如何显示您的 php 代码而不是这种冗长的冗词?
-
"说话很便宜,给我看代码"
-
另外,包括有关您收到的错误的信息(例如来自
curl_error())会很有帮助。请参阅How to create a Minimal, Complete, and Verifiable example 以获取有关您过去包含哪些信息的帮助。另外,当您说您使用 Google URL 对其进行了测试时,您的意思是您使用该 URL 测试了您的代码,还是您使用它测试了命令行 curl? -
为了确保清楚,您提供的一般格式示例使用 GET 参数,而不是 POST。如果系统期待 POST 但您发送的是 GET,那可能就是问题所在。
-
401 状态表示未授权,因此所需的任何 API 密钥或身份验证都不起作用。您需要确定这是 HTTP 基本身份验证、基于 cookie/会话的登录还是 NTLM 身份验证,并根据需要使用 curl。