javascript - CakePhp:使用 CakePHP HttpClient 调用 API 时响应正文中出现错误
问题描述
我的 API 响应中有一些 HTML 文本。
我得到的回应
预览的回应
这是我的代码(PHP):
public function getBeatmapInformations() {
$this->render(false);
if($this->request->is('get')){
$url = $_GET['beatmapUrl'];
$isOsuUrlBeatmap = "#^(?:https://)?osu\.ppy\.sh/(?:b|beatmapsets)/(\d*)#";
if(preg_match($isOsuUrlBeatmap, $url, $matches)){
$OSU_API_KEY = "MY_API_KEY";
$httpClient = new Client();
$response = $httpClient->get('https://osu.ppy.sh/api/get_beatmaps', [
's' => intval($matches[1]),
'k' => $OSU_API_KEY
]
);
$result = $response->body();
if(!empty($result)){
echo $result;
}
}
}
}
Javascript 端(AJAX 请求):
function launchAjaxRequest(beatMapUrl) {
let url = beatMapUrl.replace(/['"]+/g, '');
$.get({
type : "GET",
url: '/ofv/getBeatmapInformations',
data: {
beatmapUrl : url,
},
success: function(data){
fillModesAvailablesForBeatmap(data);
}
});}
解决方案
您不应该在 CakePHP 的控制器操作中手动回显任何内容。在 CakePHP 中实现 json 输出的方法是使用带有 Request Handler 的 Data Views:
1.在控制器的 initialize() 方法中启用请求处理程序:
public function initialize(){
$this->loadComponent("RequestHandler");
}
2.在您的操作中,将您的数据设置为序列化:
$result = $response->body();
$this->set(compact("result"));
$this->set("_serialize", "result");
有关请求处理程序和数据视图的更多信息,请参阅文档:JSON 和 XML 视图
正如可能有人会指出的那样,您在这里还有一个替代方案:您可以在使用 die() 回显数据后立即停止执行脚本。但这不是处理这个的蛋糕方式。
推荐阅读
- actions-on-google - 如何更新 Actions 项目类别以使用 Actions SDK
- excel - Excel VBA:使用值 > 255 时出现 chr 函数错误
- php - 当我按下编辑时,它不会自动填充表格中的输入文本
- python - 有没有办法跟踪 robocopy 的进度
- amazon-ec2 - 在 AWS EC2 上安装 CartoDB
- google-apps-script - 从另一个工作表设置单元格值的脚本
- python - python中的最佳拟合线在np.poly中不起作用
- c++ - 非标准扩展链接错误 CMake
- java - 如果 application.properties 中缺少一个键,如何初始化另一个键的值
- java - 如何将以前的片段称为新片段?