LaraveでAPIを作成して、そのAPIに下記のJSON形式のデータをpostしました。
その時にjson_decode関数でデコードした際にNULLを返したので、原因を特定して解消しました。
postしたJSON形式のデータ
【結論】リクエストのボディ部分のみをjson_decodeする
結論から言うと、受け取ったデータのうち、ボディ部分のみをjson_decode関数を使用してデコードすることで解決しました。
file_get_contentsでファイルの内容を全て文字列に読み込みます。
また、php://inputを指定する事で、リクエストの body 部から生のデータを読み込むことができます。
var_dump($data)すると、
array (size=4) 'userId' => string '12345' (length=5) 'name' => string 'Sato' (length=4) 'guitar' => string 'Fender' (length=6) 'type' => string 'Stratocaster' (length=12)
このように連想配列にパースしたオブジェクトを返してくれます。
ちなみに第二引数にtrueを指定しない場合($data = json_decode(file_get_contents('php://input'));)、
var_dump($data)すると、
object(stdClass)[269] public 'userId' => string '12345' (length=5) public 'name' => string 'Sato' (length=4) public 'guitar' => string 'Fender' (length=6) public 'type' => string 'Stratocaster' (length=12)
このようになります。
単純に json_decode($request) すると、Syntax errorになる
POSTで受け取ったデータ(Request $request)をそのままjson_decodeに入れてもSyntax errorとなるため、NULLを返します。
json_decode($request);
return json_last_error_msg();
→Syntax error
※json_last_error_msg()は、直近の json_encode() や json_decode() の呼び出しのエラー文字列を返します。
つまり構文エラーを起こしていることがわかります。
json_decode($request)だとbody部以外の余計なデータも含まれてしまう
POSTで受け取ったデータには、body部以外に様々な情報が含まれています。
var_dump($request)するとわかりますが、
object(Illuminate\Http\Request)[51] protected 'json' => object(Symfony\Component\HttpFoundation\ParameterBag)[43] protected 'parameters' => array (size=4) 'userId' => string '12345' (length=5) 'name' => string 'Sato' (length=4) 'guitar' => string 'Fender' (length=6) 'type' => string 'Stratocaster' (length=12) protected 'convertedFiles' => null protected 'userResolver' => object(Closure)[31] public 'static' => array (size=1) 'app' => object(Illuminate\Foundation\Application)[2] ... public 'this' => object(Illuminate\Auth\AuthServiceProvider)[47] protected 'app' => object(Illuminate\Foundation\Application)[2] ... public 'parameter' => array (size=1) '$guard' => string '<optional>' (length=10) protected 'routeResolver' => object(Closure)[229] public 'static' => array (size=1) 'route' => object(Illuminate\Routing\Route)[199] ... public 'this' => object(Illuminate\Routing\Router)[34] protected 'events' => object(Illuminate\Events\Dispatcher)[35] ... protected 'container' => object(Illuminate\Foundation\Application)[2] ... protected 'routes' => object(Illuminate\Routing\RouteCollection)[37] ... protected 'current' => object(Illuminate\Routing\Route)[199] ... protected 'currentRequest' => &object(Illuminate\Http\Request)[51] protected 'middleware' => array (size=10) ... protected 'middlewareGroups' => array (size=2) ... public 'middlewarePriority' => array (size=7) ... protected 'binders' => array (size=0) ...
このようにbody部以外にもさまざまな情報があることがわかります。
なので、そのままjson_decode($request)をしても、うまくデコードできずにSyntax errorとなってしまいます。
しかし、file_get_contents('php://input')を利用する事で
'{"userId": "12345","name": "Sato","guitar": "Fender","type": "Stratocaster"}' (length=76)
このようにbody部のみ(JSON形式)を取り出す事ができるので、json_decode()を利用する事が可能になります。
コメント