Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何通过Wordpress API从后端服务器正确下载PDF文件_Php_Wordpress_Pdf_Wordpress Json Api - Fatal编程技术网

Php 如何通过Wordpress API从后端服务器正确下载PDF文件

Php 如何通过Wordpress API从后端服务器正确下载PDF文件,php,wordpress,pdf,wordpress-json-api,Php,Wordpress,Pdf,Wordpress Json Api,我构建了一个自定义Wordpress插件。插件前端是一个Facebook React JS应用程序,通过一个短代码嵌入Wordpress页面。它专门使用Wordpress REST API在客户端浏览器和Wordpress之间发送和检索JSON。Wordpress在这个场景中扮演着中间人的角色。处理客户机请求的REST路由只需调用后端REST API,并将响应从另一台服务器返回给客户机 我刚刚在应用程序中添加了一个新功能,允许用户下载由不同后端服务器(而不是Wordpress)动态生成的PDF文

我构建了一个自定义Wordpress插件。插件前端是一个Facebook React JS应用程序,通过一个短代码嵌入Wordpress页面。它专门使用Wordpress REST API在客户端浏览器和Wordpress之间发送和检索JSON。Wordpress在这个场景中扮演着中间人的角色。处理客户机请求的REST路由只需调用后端REST API,并将响应从另一台服务器返回给客户机

我刚刚在应用程序中添加了一个新功能,允许用户下载由不同后端服务器(而不是Wordpress)动态生成的PDF文件。我的计划是在Wordpress REST API上添加另一个路由,该路由将调用后端服务器并返回由另一个服务器生成的PDF文件。Wordpress基本上只是将请求代理到后端服务器,并将响应返回到客户端浏览器

但是,当我尝试这样做时,响应主体是一个字符串,而不是从后端服务器返回的原始字节数组。我可以直接向后端服务器发出请求,它会正确返回PDF文件(例如
http://default-internal-backend-server.example.com/api/v1/quote/asdf123/pdf

让Wordpress插件处理REST请求(例如
https://example.com/wp-json/my-plugin/v1/quote/asdf123/pdf
)并从上游服务器返回原始的、未触及的响应

例如,我正在这样做:

在应用程序的UI上,我有一个简单的锚定标记,如下所示:


上述URL在插件的其余路径中注册,如下所示:

class My\u Plugin\u REST\u Controller扩展了WP\u REST\u Controller{
// ****
注册rest路由('myplugin','/quote/(?P\w+)/pdf',
排列(
排列(
'methods'=>WP\u REST\u Server::READABLE,
'callback'=>array($this'get\u quote\u pdf'),
'args'=>array()
)
)
);
公共函数获取pdf($request){
$api_service=api_service::get_instance();
$response=$api_服务->getQuotePdf($request);
$http\u response=新的WP\u REST\u响应($response,200);
$http_response->header('Content-Type','application/pdf');
返回$http_响应;
}
// ****
}
类API_服务{
公共函数getQuotePdf($request){
$curl=curl_init();
$default\u options=array(
'url'=>'http://default-internal-backend-server.example.com'
);
$api\u options=get\u选项('my\u plugin\u api',$default\u options);
$api_url=$api_options['url']./api/v1/quote/'.$request['id']./pdf'
curl_setopt_数组($curl,数组(
CURLOPT_URL=>$api_URL,
CURLOPT_RETURNTRANSFER=>true,
CURLOPT_编码=>'',
CURLOPT_MAXREDIRS=>10,
CULLOPT_超时=>30,
CURLOPT_HTTP_VERSION=>CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST=>“获取”,
CURLOPT_HTTPHEADER=>数组(
“接受:应用程序/pdf”,
“缓存控制:无缓存”
)
));
$response=curl\u exec($curl);
$err=curl\u error($curl);
curl_close($curl);
如果($err){
返回null;
}否则{
返回$response;
}
}
}
Wordpress正在正确处理来自客户端JavaScript应用程序的请求,后端服务器正在正确调用,后端服务器正在返回PDF文件

但是,在上面的示例中,Wordpress返回的是PDF的字符串表示形式,而不是外部服务器返回的原始字节。我不得不与
WP\u Rest\u响应
斗争,让它将
内容类型
设置为
appapplication/pdf
。如果我设置
Content-Length
标题,它会在没有明显原因的情况下将
Content-Type
更改为
application/json

如何返回原始字节而不是响应的字符串版本

我的下一步是完全删除Wordpress与此相关的内容,并在浏览器中链接到另一个URL(例如),该URL使用反向代理直接访问内部服务器


我确实读到PHP没有字节[]的本机数据类型,这可能是限制因素。

我没有这样做,因为我找不到解决方案。我的“解决办法”是把Wordpress从等式中去掉。因此,我没有通过Wordpress JSON API调用生成PDF的下游服务器,而是通过Nginx反向代理调用下游服务器。问题解决了。呃,Wordpress/PHP…这个人的回答帮助我不返回Wordpress响应对象,只使用普通的PHP
标题('Content-Type:application/pdf')
然后打印我的内容并退出()由于找不到解决方案,我最终没有这样做。我的“解决办法”是把Wordpress从等式中去掉。因此,我没有通过Wordpress JSON API调用生成PDF的下游服务器,而是通过Nginx反向代理调用下游服务器。问题解决了。呃,Wordpress/PHP…这个人的回答帮助我不返回Wordpress响应对象,只使用普通的PHP
标题('Content-Type:application/pdf')然后打印我的内容并退出()