di laravel ketika kamu mereturn array pada controller/handler akan otomatis di konversi ke json
Route::get('/prices/bnb', function() {
return [
'symbol' => 'BNB',
'price_in' => 'USD',
'price' => 573.53
];
});
responnse:
{
"symbol": "BNB",
"price_in": "USD",
"price": 573.53
}
namun masalah terjadi jika harga menjadi 573.0
laravel akan merubah type data yang awalnya float ke int menjadi 573
Route::get('/prices/bnb', function() {
return [
'symbol' => 'BNB',
'price_in' => 'USD',
'price' => 573.0
];
});
response:
{
"symbol": "BNB",
"price_in": "USD",
"price": 573
}
ini tidak akan menjadi masalah pada bahasa dinamic type seperti JS, PHP dll namun saat sisi client menggunakan bahasa static type misal Golang atau Dart ini cukup merepotkan mereka, ya meskipun bisa di atasi dari sisi bahasa static type tapi cukup meyebalkan.
cara yang paling mudah untuk menangani masalah adalah mengatur flag JSON_PRESERVE_ZERO_FRACTION
ketika membuat json
Route::get('/prices/bnb', function() {
return response()->json([
'symbol' => 'BNB',
'price_in' => 'USD',
'price' => 573.0
], 200, [], JSON_PRESERVE_ZERO_FRACTION);
});
ini akan mempertahankan nilai float pada nilai float yang belakangnya 0 (x.0)
namun jika terlalu banyak endpoint yang harus menerapkan JSON_PRESERVE_ZERO_FRACTION
akan cukup repot juga, tenang jawabannya adalah middleware, ya cukup ubah aja nilai json sebelum di laravel mengembalikan response.
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\JsonResponse;
class BeforeResponse
{
/**
* Handle the incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return \Illuminate\Http\Response
*/
public function handle($request, Closure $next)
{
/** @var \Illuminate\Http\Response */
$response = $next($request);
if ($response instanceof JsonResponse) {
$response->setJson(json_encode(
value: $response->getOriginalContent(),
flags: JSON_PRESERVE_ZERO_FRACTION
));
}
return $response;
}
}
middleware ini mengecek jika response berupa JsonResponse maka akan mengambil nilai originalnya dan melakukan decode sendiri dengan flag JSON_PRESERVE_ZERO_FRACTION
Top comments (0)