忽略参数的 REST GET,PHP Symfony 3 Mpdf
REST GET with parameter ignored, PHP Symfony 3 Mpdf
在 Symfony 3 框架上使用 Mpdf(和 tfox symfony 包)为 PDF 处理器开发 REST API。我创建了两个GET请求,一个没有参数用于测试,一个有参数(HTML文件的URL)我想阅读然后转换成PDF。
通用 GET 函数:
/**
*
* @Rest\Get("/create")
*/
public function createPDFAction(){
$mpdfService = $this->get('tfox.mpdfport');
$html = "<h1> Hello </h1>";
$mpdf = $mpdfService->getMpdf();
$mpdf->WriteHTML($html);
$mpdf->Output();
exit;
}
带有参数的第二个 GET 函数:
/**
* @param $htmlSource
* @Rest\Get("/create/{htmlSource}")
*/
public function createPDFFromSourceAction($htmlSource){
$mpdfService = $this->get('tfox.mpdfport');
$html = file_get_contents($htmlSource);
$mpdf = $mpdfService->getMpdf();
$mpdf->WriteHTML($html);
$mpdf->Output();
exit;
}
问题是,当我使用浏览器或 Postman 调用第二个函数时,第一个函数总是 returned 而不是 "Hello",如果我删除第一个 GET 函数,我会得到 PDF ,我得到错误 "no route found for GET/create"
我调查过:
- PDF URL 是正确的,我在第一个函数中手动插入它并工作
- 没有语法错误,我复制了没有参数的相同函数并工作了
我打的电话是:
如果我手动将 PATH-TO-FILE-LOCALLY 放入函数 1 中,它就可以正常工作
所以我有 2 个问题:
- 由于我是 REST 的新手并且 LAMP,我应该使用 GET 还是其他?我的目标是读取 HTML 用户将填写到变量中的表单并将其传递给 Mpdf,后者会将其转换为 PDF 并 return 该 PDF 以供查看或下载
- 为什么只读取第一个 GET 函数?
注意:我正在 Linux 上开发,使用 PHPStorm,PHP 7,Symfony 3,本地主机,我正在测试的 html 文件已打开我的本地机器
旁白:如果这个问题得到解决,我应该将其上传到我的客户端服务器(即 Apache)——你有没有关于如何做到这一点的指南以及 URL s 改为 ?
提前谢谢大家
更新:
我已将功能更改为 POST 方法,现在可以正常工作了:
/**
* @Rest\Post("/mPDF/")
*/
public function createPDFAction(Request $request){
$source = $request->get('source');
if($source == ""){
return new View('No Data found', Response::HTTP_NO_CONTENT);
}
$mpdfService = $this->get('tfox.mpdfport');
$html = file_get_contents($source);
$mpdf = $mpdfService->getMpdf();
$mpdf->WriteHTML($html);
$mpdf->Output();
exit;
}
发布到 Apache 生产服务器并调整一些配置后,该站点现已上线! - 但现在我面临一个新问题,我将 post 一个关于我拥有的所有配置信息的新问题 - 基本上 POST 方法是 returning {
"error": {
"code": 405,
"message": "Method Not Allowed"
}
}
http://localhost:8000/create?htmlSource=PATH-TO-FILE-LOCALLY
("/create/{htmlSource}")
这些路径不匹配。
第一条路径由域名和路由 create
组成,而第二条路径由路由 "create" + 斜线 + 通配符组成。
路由注释中未定义查询参数。相反,使用
在控制器内部访问它们
public function createPDFFromSourceAction(Request $request)
{
$htmlSource = $request->query->get('htmlSource'); // query string parameter
$somethingElse = $request->request->get('somethingElse'); //POST request parameter
...
}
Symfony 会在控制器中为您传递 Request
对象。
至于你的另一个问题,GET 请求通常用于不改变应用程序状态的事情,而 POST/PUT/PATCH/DELETE 请求改变状态。由于您正在上传内容,请使用 POST 请求。
对于你的 'side note' 你应该问另一个问题。
在 Symfony 3 框架上使用 Mpdf(和 tfox symfony 包)为 PDF 处理器开发 REST API。我创建了两个GET请求,一个没有参数用于测试,一个有参数(HTML文件的URL)我想阅读然后转换成PDF。
通用 GET 函数:
/**
*
* @Rest\Get("/create")
*/
public function createPDFAction(){
$mpdfService = $this->get('tfox.mpdfport');
$html = "<h1> Hello </h1>";
$mpdf = $mpdfService->getMpdf();
$mpdf->WriteHTML($html);
$mpdf->Output();
exit;
}
带有参数的第二个 GET 函数:
/**
* @param $htmlSource
* @Rest\Get("/create/{htmlSource}")
*/
public function createPDFFromSourceAction($htmlSource){
$mpdfService = $this->get('tfox.mpdfport');
$html = file_get_contents($htmlSource);
$mpdf = $mpdfService->getMpdf();
$mpdf->WriteHTML($html);
$mpdf->Output();
exit;
}
问题是,当我使用浏览器或 Postman 调用第二个函数时,第一个函数总是 returned 而不是 "Hello",如果我删除第一个 GET 函数,我会得到 PDF ,我得到错误 "no route found for GET/create"
我调查过:
- PDF URL 是正确的,我在第一个函数中手动插入它并工作
- 没有语法错误,我复制了没有参数的相同函数并工作了
我打的电话是:
如果我手动将 PATH-TO-FILE-LOCALLY 放入函数 1 中,它就可以正常工作
所以我有 2 个问题:
- 由于我是 REST 的新手并且 LAMP,我应该使用 GET 还是其他?我的目标是读取 HTML 用户将填写到变量中的表单并将其传递给 Mpdf,后者会将其转换为 PDF 并 return 该 PDF 以供查看或下载
- 为什么只读取第一个 GET 函数?
注意:我正在 Linux 上开发,使用 PHPStorm,PHP 7,Symfony 3,本地主机,我正在测试的 html 文件已打开我的本地机器
旁白:如果这个问题得到解决,我应该将其上传到我的客户端服务器(即 Apache)——你有没有关于如何做到这一点的指南以及 URL s 改为 ?
提前谢谢大家
更新:
我已将功能更改为 POST 方法,现在可以正常工作了:
/**
* @Rest\Post("/mPDF/")
*/
public function createPDFAction(Request $request){
$source = $request->get('source');
if($source == ""){
return new View('No Data found', Response::HTTP_NO_CONTENT);
}
$mpdfService = $this->get('tfox.mpdfport');
$html = file_get_contents($source);
$mpdf = $mpdfService->getMpdf();
$mpdf->WriteHTML($html);
$mpdf->Output();
exit;
}
发布到 Apache 生产服务器并调整一些配置后,该站点现已上线! - 但现在我面临一个新问题,我将 post 一个关于我拥有的所有配置信息的新问题 - 基本上 POST 方法是 returning {
"error": {
"code": 405,
"message": "Method Not Allowed"
}
}
http://localhost:8000/create?htmlSource=PATH-TO-FILE-LOCALLY
("/create/{htmlSource}")
这些路径不匹配。
第一条路径由域名和路由 create
组成,而第二条路径由路由 "create" + 斜线 + 通配符组成。
路由注释中未定义查询参数。相反,使用
在控制器内部访问它们public function createPDFFromSourceAction(Request $request)
{
$htmlSource = $request->query->get('htmlSource'); // query string parameter
$somethingElse = $request->request->get('somethingElse'); //POST request parameter
...
}
Symfony 会在控制器中为您传递 Request
对象。
至于你的另一个问题,GET 请求通常用于不改变应用程序状态的事情,而 POST/PUT/PATCH/DELETE 请求改变状态。由于您正在上传内容,请使用 POST 请求。
对于你的 'side note' 你应该问另一个问题。