我正在调用一个 Web 服务,该服务返回一个内容类型为 application/pdf 的 PDF 文件
我可以从浏览器或 Postman 调用 Web 服务,并显示结果文件。
现在我想从 PHP 调用相同的服务,并将响应返回给调用 PHP 的客户端。
我有这个
$url = 'https://localhost:7174/customers/123/pdf';
$expectedMimeType = 'application/pdf';
$token = '****************************************';
$curl = curl_init();
curl_setopt_array(
$curl,
array(
CURLOPT_URL => $url,
CURLOPT_HTTPHEADER => array(
'Authorization: Bearer '.$token,
'Accept: '.$expectedMimeType
)
)
);
curl_exec($curl);
exit();
我认为 CURLOPT_RETURNTRANSFER 默认为 false,因此 PHP 只会将响应传递给 PHP 的调用者,这似乎确实发生了,但它正在发送回来
Content-Type: text/html; charset=UTF-8
因此,PDF 文件在浏览器(或 Postman)中显示为二进制冗长的内容。
如何让它发回正确的内容类型?理想情况下,我想传递来自其他 Web 服务的 Content-Type,这样如果其他服务返回其他 MIME 类型,我的 PHP 只会传递它,但现在,我知道它只会返回 PDF ,所以如果需要的话我可以硬编码应用程序/pdf。
感谢 ADyson 引导我走向正确的方向。老实说,我认为这行不通
<?php
$url = 'https://localhost:7174/customers/123/pdf';
$expectedMimeType = 'application/pdf';
$token = '****************************************';
$curl = curl_init();
curl_setopt_array(
$curl,
array(
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => array(
'Authorization: Bearer '.$token,
'Accept: '.$expectedMimeType
)
)
);
$response = curl_exec($curl);
$info = curl_getinfo($curl);
header('Content-Type: '.$info['content_type']);
echo $response;
exit();
但确实如此。 $response 作为字符串返回,并且使用正确的内容类型回显它效果非常好。我认为因为响应是二进制数据,所以当 PHP 将其转换为字符串时,它会丢失一些东西。