Php 使用cURL的POST-API存在问题

Php 使用cURL的POST-API存在问题,php,api,curl,post,Php,Api,Curl,Post,我正在尝试使用cURL发布API,但运气不好。我已经研究这两天了,但我似乎无法让它发挥作用 下面是一个URL示例,我可以将其粘贴到web浏览器中,它可以正常工作,没有问题: http://{myserver}:{port}/api.aspx?Action=AddTicket&Key=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx&Subject=Test&Description=Test&Username={domain}\{userna

我正在尝试使用cURL发布API,但运气不好。我已经研究这两天了,但我似乎无法让它发挥作用

下面是一个URL示例,我可以将其粘贴到web浏览器中,它可以正常工作,没有问题:

http://{myserver}:{port}/api.aspx?Action=AddTicket&Key=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx&Subject=Test&Description=Test&Username={domain}\{username}
(显然,我修改了一些信息)

我知道cURL是最新的,并且在服务器上工作,因为我可以向[]发出一个简单的请求,它会正确返回页面,并且我在php.info页面上确认它已启用

我已经尝试了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);
编辑 我试过评论中给出的一些例子。这是我目前正在运行的一个小测试

$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) ""

有人知道这意味着什么吗?

编辑:查看您的最新更新,尝试在您的PostField上使用json\u编码

您提供的URL使用GET参数。希望下面的代码片段能有所帮助

    $curl = curl_init();


    // Heres our POSTFIELDS
    $params = array(
        'param1'  => 'blah1',
        'param2'  => 'blah2'
    );

    $params_json = json_encode($params);

    curl_setopt_array($curl, array(
        CURLOPT_URL => 'http://example.com',
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_POST => 1,
        CURLOPT_HTTPAUTH => CURLAUTH_ANY,
        CURLOPT_POSTFIELDS => $params_json
    ));

    $response = curl_exec($curl);
    $error = curl_error($curl);
    curl_close($curl);

您的工作示例表明,这根本不是POST请求,而是GET请求

尝试按如下方式构建您的URL:

$data = array(
    'Action' => 'AddTicket',
    'key' => $key,
    'subject' => $subject,
    'description' => $details,
    'username' => '{domain}\{username}'
);

$query = http_build_query($data);

$url = 'http://{myserver}:{port}/api.aspx?' . $query;

然后,您可能只需要对该URL执行GET请求。

显示php代码而不是冗长的措辞如何?“Talk很便宜,请显示代码”还包括有关您收到的错误的信息(例如,来自
curl\u error()
)会很有帮助。请参阅以获取有关在过去中包含哪些信息的帮助。另外,当你说你已经用Google URL测试过它时,你是说你用那个URL测试过你的代码,还是用它测试过命令行curl?为了确保这一点,你提供的通用格式示例使用GET参数,而不是POST参数。如果系统正在等待POST,但您正在发送GET,这可能就是问题所在。401状态表示未授权,因此所需的任何API密钥或身份验证都不起作用。您需要确定这是HTTP基本身份验证、基于cookie/会话的登录还是NTLM身份验证,并根据需要使用curl。感谢您的回复!不幸的是,这对我不起作用。我试着将它改编成我当前的代码,也只是复制和粘贴你的代码并调整细节。不走运,抱歉。谢谢你的帮助,但我一点运气都没有。我尝试了一个直接的HTTP_GET()请求和一个使用cURL的GET请求,但仍然没有任何结果……您必须登录才能添加票证吗?很可能是身份验证问题。不,您不必登录。