【问题标题】:CakePhp: Got erros in response body when calling an API with the CakePHP HttpClientCakePhp:使用 CakePHP HttpClient 调用 API 时,响应正文中出现错误
【发布时间】:2018-10-20 09:08:31
【问题描述】:

我的 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);
    }
});}

【问题讨论】:

    标签: javascript php ajax api cakephp


    【解决方案1】:

    您不应在 CakePHP 的控制器操作中手动回显任何内容。 CakePHP 中实现 json 输出的方法是使用 Data Views with Request Handler:

    1.在控制器的 initialize() 方法中启用请求处理程序:

    public function initialize(){
        $this->loadComponent("RequestHandler");
    }
    

    2.在您的操作中,将您的数据设置为序列化:

    $result = $response->body();
    $this->set(compact("result"));
    $this->set("_serialize", "result");
    

    有关请求处理程序和数据视图的更多信息,请参阅文档:JSON and XML views

    可能有人会指出,您在这里还有一个替代方案:您可以在使用 die() 回显数据后立即停止执行脚本。但这不是 Cake 的处理方式。

    【讨论】:

    • 谢谢,您提供的最后一个解决方案是有效的,我知道这是一种肮脏的方式,但至少它可以正常工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-26
    • 2017-10-02
    相关资源
    最近更新 更多