2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Laravel Debugbarな環境で自作APIがjson_decodeでnullになってしまったときの対処法

Posted at

Laravel Debugbar
Laravelでプロジェクトを作ったらとりあえず入れておくパッケージのひとつです。
そんな便利なLaravel Debugbarですが、先日これが原因でちょっと困ったことになりました。(原因はこちらにありますが......)

困ったこと

とあるプロジェクトでjsonを返すWebAPIがありました。
もちろんLaravelです。

このAPI、フロントで使うこと前提で作ってたのですが、サーバーサイドでも呼び出すことになりました。
「はいはい、curlで呼べばいいのね~」(Guzzle使いました)と思いコードを書き、実行してみたところ......

TestController.php
$url = route('test-api');
$client = new \GuzzileHttp\Client();
// 自己証明書なhttpsなので['verify' => false]
$response = $client->get($url, ['verify' => false]);
$content = $response->getBody()->getContents();
$json = json_encode($content);

// var_dump全部出す
ini_set('xdebug.var_display_max_children', -1);
ini_set('xdebug.var_display_max_data', -1);
ini_set('xdebug.var_display_max_depth', -1);

var_dump($json); // null!!

え、なんでや......
レスポンスの中身を確認してみると

string(3458) ""{
           "status" : "200",
           "data" : [
               "データがいろいろ"
           ]
           "<link rel='stylesheet' type='text/css' property='stylesheet' 
href='//localhost/_debugbar/assets/stylesheets?v=1551204114'><script 
type='text/javascript' src='//localhost/_debugbar/assets/javascript?
v=1551204114'></script><script type="text/javascript">jQuery.noConflict(true);
</script>
.....

!?
なんだこれは......

jsonデータに大量のCSSやJavaSctipt、HTMLが含まれていました。
よく見てみると、_debugbarの文字がちらほら
どうやらこれはLaravel DebugbarのHTML部分のようです。
APIをコールした場合に、debugbarを再表示するために付与されるもののようです。

解決策

ぐぐったら一発でした。
Laravel debugbar adding data to my api response.

config/debugbar.php
<?php

return [
    // 省略

    'except` => [
        'telescope*',
        // これを追加
        'api*',
    ]

    // 以下省略
]

これだけ
debugbar.phpがない人は以下を実行してください。

php artisan vendor:publish --provider="Barryvdh\Debugbar\ServiceProvider"

これでAPIのレスポンスにdebugbarの情報が付与されることはなくなりました。
めでたし

根本的な原因

ちょろっと調査したところ、問題のWebAPIはController側でjson文字列を返していることがわかりました。

こんな感じ.php
// 実際はDBから取ってきていろいろしてる
$json = '"status": "200","data": [いろいろ]';
return $json;

文字列で返すのが良いのか悪いのかは置いておいて、以下のようにすればdebugbarの情報は付与されずに返ってきます。

情報は付与されない.php
$json = [
    'status' => 200,
    'data' => [
        // いろいろ
    ]
];
return $json;

わざわざstringにしなくてもLaravelがjson形式にしてくれるので、不要な手間をかけずにすみますね。
(もしくは元ソースの$jsonをjson_decodeするとか)
というかこれが普通のやり方だと思うんですが、なぜstringなんかになっていたのでしょうか......

何はともあれ、ぐぐって解決策が出てくるということは、稀によくあることだと思うので、備忘録として残してみました。
以上です。

2
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?