You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP调用Remedy REST API创建带附件条目失败(Postman可正常运行)

问题:Remedy REST API上传PDF附件失败

我已多日尝试通过Remedy REST API创建带PDF附件的条目,但始终失败,每次请求要么返回500超时错误,要么是Bad Request错误。使用环境为Windows系统下的XAMPP,PHP版本7,Curl版本7.70。登录获取AR-JWT token的步骤完全正常,但上传附件的CURL请求出问题。官方文档中有相关上传附件示例。

以下是我的PHP代码:

<?php
$urlSample = '<<MY URL>>';
$myUser = '<<MY USER>>';
$myPassword = '<<MY PASS>>';
$myAuthString = '<<MY AUTH STRING>>';
$curl = curl_init();
curl_setopt_array($curl, array(
  CURLOPT_URL => $urlSample . '/api/jwt/login?username='.$myUser.'&password='.$myPassword.'&authString='.$myAuthString,
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'POST',
  CURLOPT_HTTPHEADER => array(
    'Content-Type: application/x-www-form-urlencoded'
  ),
));
$response = curl_exec($curl);
curl_close($curl);
$token = $response; // 这一步正常工作!!!

// 定义接口URL
$url = $urlSample . '/api/arsys/v1/entry/SRM:RequestInterface_Create?fields=values(Request%20Number)';

// PDF附件
$pdf_file = "mypdf.pdf";

// 表单字段及值
$fields = array(
    "values" => array(
        array(
            "z1D Action" => "CREATE",
            "Source Keyword" => "RESTAPI",
            "TitleInstanceID" => "<< MY INSTANCE ID >>",
            "Login ID" => $myUser,
            "Customer Login" => "example",
            "Date Required" => date('Y-m-d') . 'T' . date('h:m:s'),
            "z1D_WorkInfoSummary" => "PDF Form", // 不传附件时能正常工作
            "z2AF_WIAttachment1" => $pdf_file,
            "SR Type Field 1" => "Requestor Name:TEST | Phone Number:123-456-7890 | Equipment: Email",
            "SR Type Field 2" => "TEST",
            "SR Type Field 3" => "TEST",
            "SR Type Field 4" => "TEST",
            "SR Type Field 5" => "TEST",
          )
    )
);

// 创建multipart/form-data边界
$boundary = uniqid();

// 构建multipart/form-data请求体
$data = "--" . $boundary . "\r\n";
$data .= "Content-Disposition: form-data; name=\"entry\"\r\n";
$data .= "Content-Type: application/json\r\n\r\n";
$data .= json_encode($fields) . "\r\n";
$data .= "--" . $boundary . "\r\n";
$data .= "Content-Disposition: form-data; name=\"attach-z2AF_WIAttachment1\"; filename=\"$pdf_file\"\r\n";
$data .= "Content-Type: application/octet-stream\r\n\r\n";
$data .= file_get_contents($pdf_file) . "\r\n";
$data .= "--" . $boundary . "--\r\n";

// HTTP头
$headers = array(
    "Authorization: AR-JWT " . $token,
    "Content-Type: multipart/form-data; boundary=" . $boundary,
    "Accept: application/json"
);

// 初始化CURL
$curl = curl_init();

// 设置CURL选项
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

// 执行请求 - 超时了
$response = curl_exec($curl); 

// 关闭CURL会话
curl_close($curl);

// 打印响应
print_r(json_decode($response)); 
?>

请问我的CURL调用是否存在问题?


问题分析与修复建议

你的CURL调用存在几个关键问题,导致上传失败:

1. 手动拼接multipart数据的风险

你手动构建了multipart/form-data请求体,但PDF是二进制文件,直接用file_get_contents拼接进字符串时,会因为二进制数据破坏边界格式、换行符不兼容(Windows的\r\n可能与服务器预期不符)等问题,导致请求格式错误。建议让CURL自动处理multipart数据,不要手动拼接。

2. 字段结构错误

Remedy API要求values是单个对象(对应一条条目),但你写成了数组套数组:"values" => [ {...} ],正确的结构应该是"values" => {...}。

3. 时间格式错误

原代码中date('h:m:s')是错误的:h是12小时制小时,m代表月份,分钟应该用i,正确格式应为date('H:i:s')(24小时制),格式错误可能触发Bad Request。

4. 超时设置缺失

上传附件的请求没有设置超时时间,默认CURL超时较短,容易触发超时错误,需添加CURLOPT_TIMEOUT设置。

5. 附件字段关联冗余

在values中设置z2AF_WIAttachment1为文件名是多余的,multipart中的attach-z2AF_WIAttachment1字段会自动关联到对应表单字段,无需重复设置。


修正后的代码示例

<?php
$urlSample = '<<MY URL>>';
$myUser = '<<MY USER>>';
$myPassword = '<<MY PASS>>';
$myAuthString = '<<MY AUTH STRING>>';
$curl = curl_init();
curl_setopt_array($curl, array(
  CURLOPT_URL => $urlSample . '/api/jwt/login?username='.$myUser.'&password='.$myPassword.'&authString='.$myAuthString,
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'POST',
  CURLOPT_HTTPHEADER => array(
    'Content-Type: application/x-www-form-urlencoded'
  ),
));
$response = curl_exec($curl);
curl_close($curl);
$token = $response;

// 定义接口URL
$url = $urlSample . '/api/arsys/v1/entry/SRM:RequestInterface_Create?fields=values(Request%20Number)';

// PDF附件路径
$pdf_file = "mypdf.pdf";

// 修正表单字段结构
$fields = array(
    "values" => array(
        "z1D Action" => "CREATE",
        "Source Keyword" => "RESTAPI",
        "TitleInstanceID" => "<< MY INSTANCE ID >>",
        "Login ID" => $myUser,
        "Customer Login" => "example",
        "Date Required" => date('Y-m-d') . 'T' . date('H:i:s'),
        "z1D_WorkInfoSummary" => "PDF Form",
        "SR Type Field 1" => "Requestor Name:TEST | Phone Number:123-456-7890 | Equipment: Email",
        "SR Type Field 2" => "TEST",
        "SR Type Field 3" => "TEST",
        "SR Type Field 4" => "TEST",
        "SR Type Field 5" => "TEST",
    )
);

// 让CURL自动处理multipart数据
$postFields = array(
    'entry' => json_encode($fields),
    'attach-z2AF_WIAttachment1' => new CURLFile(realpath($pdf_file), 'application/pdf', basename($pdf_file))
);

// HTTP头(无需手动设置Content-Type,CURL会自动添加带边界的multipart头)
$headers = array(
    "Authorization: AR-JWT " . $token,
    "Accept: application/json"
);

// 初始化CURL
$curl = curl_init();

// 设置CURL选项
curl_setopt_array($curl, array(
    CURLOPT_URL => $url,
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => $postFields,
    CURLOPT_HTTPHEADER => $headers,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT => 0,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
));

// 执行请求并输出调试信息
$response = curl_exec($curl);
if(curl_errno($curl)){
    echo 'CURL错误: ' . curl_error($curl);
}

curl_close($curl);

// 打印响应
print_r(json_decode($response)); 
?>

额外调试建议

  • 开启CURL错误输出:用curl_errno和curl_error查看具体错误,比只看服务器返回的模糊提示更有用。
  • 验证文件路径:确保realpath($pdf_file)能返回正确的文件路径,避免文件找不到的问题。

内容的提问来源于stack exchange,提问作者ricardorios

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 01:55:15