php - 使用 multipart/form-data POST 请求时从 ConnectWise API 获得无效响应
问题描述
使用 ConnectWise API 将文档上传到现有票证时出现错误,我认为问题在于我如何执行 curl 请求。
我曾尝试根据我在 Google 上找到的内容来处理 curl 选项,但似乎没有任何效果。
这是 POST 请求
function post_ticket_attachment ( $ticket_id, $file_attachment ) {
$url = "https://api-na.myconnectwise.net/v4_6_release/apis/3.0/system/documents";
$filename = $file_attachment['name'];
$filedata = $file_attachment['tmp_name'];
$filesize = $file_attachment['size'];
$fields = array (
"recordId" => $ticket_id,
"recordType" => "Ticket",
"title" => $file_attachment['name']
);
$filenames = array($filedata);
$files = array();
foreach( $filenames as $f ){
$files[$f] = file_get_contents($f);
}
$ch = curl_init();
$boundary = uniqid();
$delimiter = '-------------' . $boundary;
$post_data = build_data_files($boundary, $fields, $files);
curl_setopt_array($ch, array(
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POST => 1,
CURLOPT_POSTFIELDS => $post_data,
CURLOPT_HTTPHEADER => array(
"Authorization: basic " . $connect_wise_auth,
"Content-Type: multipart/form-data; boundary=" . $delimiter,
"Content-Length: " . strlen($post_data)
),
));
$response = curl_exec($ch);
console_log ($response);
}
这是我构建帖子数据的方式:
function build_data_files($boundary, $fields, $files){
$data = '';
$eol = "\r\n";
$delimiter = '-------------' . $boundary;
foreach ($fields as $name => $content) {
$data .= "--" . $delimiter . $eol
. 'Content-Disposition: form-data; name="' . $name . "\"".$eol.$eol
. $content . $eol;
}
foreach ($files as $name => $content) {
$data .= "--" . $delimiter . $eol
. 'Content-Disposition: form-data; name="' . $name . '"; filename="' . $name . '"' . $eol
. 'Content-Transfer-Encoding: binary'.$eol
;
$data .= $eol;
$data .= $content . $eol;
}
$data .= "--" . $delimiter . "--".$eol;
return $data;
}
我希望请求能够正确发布,但我却收到 ConnectWise 的回复,指出“无法路由。代码库/公司无效。”
解决方案
我刚刚遇到这个问题,是因为我忘记将用户名和密码添加到基本授权中。看起来您正在添加它,但我看不到其中包含的内容,只是为了澄清一下,用户名是公司 + 公钥,密码是私钥,同时以 base64 编码。
从官方文档(您可能要登录才能看到它)
建议创建 API 成员而不是使用绑定到特定成员的 API 密钥。授权:Basic base64(companyid+publickey:privatekey)(授权:Basic Y29tcGFueWlkK3B1YmxpY2tleTpwcml2YXRla2V5)
一旦您正确添加了该信息,API 将能够检查您的用户是否正确以及您是否属于该公司。
请注意,这是一个非常具体的 API 的一个非常具体的问题,所以如果您将来发现更多问题,您可能会有更多的运气直接在他们的论坛上提问。
推荐阅读
- c# - 如何为 SOAP 提供列表参数
- pkcs#11 - 如何使用 C# 通过智能卡远程登录 Windows 10?
- sql-server - 为什么 Microsoft.SqlServer.TransactSql.ScriptDom.TSqlParser 无法解析简单的有效表达式?
- c# - 在请求标头中包含来自响应标头的 cookie
- anylogic - Counting connections of specific agent type
- java - 将 java 7 迁移到 java 8 - 集合中的 forEach 和 addAll?
- git - RTC 到 Git 迁移失败
- javascript - 使用“getElementById”从javascript获取价值到java
- javascript - 是否可以在现有的 javascript/html webapp 中实现 C# 打印控制台应用程序/服务?
- javascript - 在 react js 中搜索一个好的年份选择器下拉包。我试过 react-year-picker 但图书馆有一些错误