我尝试向端点发送 POST 请求,收到 200 响应,但我发送的数据错误地保存在数据库中;
我想知道问题是出在我的 post 请求上还是出在处理该请求的后端代码上。
更具体地说:我正在向 Laravel + MariaDB 后端发送 POST 请求。我没有编写后端代码,我得到的所有“细节”是:
post请求有3个字段:
- user_id:患者 ID
- 密码:患者密码(所有患者均相同)
- payload:一个 json 有效负载,其结构如下:
- 'epoch_start' => '必填|数字',
- 'epoch_end' => 'required|numeric|gte:epoch_start',
- '大小' => '必需|数字|gt:0',
- '温度' => '必需|数组|最小:大小',
- '压力' => '必需|数组|最小:大小',
- '移动' => '必需|数组|最小:大小',
这是处理请求的控制器:
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Validator; use Response; use App\Models\User; use App\Models\Sensor; use Carbon\Carbon; class SensorController extends Controller { public function storeData(Request $request) { if ($request->has(['user_id', 'password', 'payload'])) { $password = $request->get('password'); $user_id = $request->get('user_id'); $user = User::where('id', $user_id)->firstOrFail(); if($user->role != "patient") return new Response('Forbidden', 403); if($password != "HIDDENPASS") return new Response('Forbidden', 403); $payload = $request->get('payload'); $data = json_decode($payload, true); $rules = [ 'epoch_start' => 'required|numeric', 'epoch_end' => 'required|numeric|gte:epoch_start', 'size' => 'required|numeric|gt:0', 'temperature' => 'required|array|min:size', 'pressure' => 'required|array|min:size', 'movement' => 'required|array|min:size', 'temperature.*' => 'numeric', 'pressure.*' => 'numeric', 'movement.*' => 'numeric', ]; $validator = Validator::make($data, $rules); if ($validator->passes()) { $s = new Sensor; $s->user_id = $user->id; $s->epoch_start = Carbon::parse($data["epoch_start"]); $s->epoch_end = Carbon::parse($data["epoch_end"]); $s->size = $data["size"]; $s->temperature = json_encode($data["temperature"]); $s->pressure = json_encode($data["pressure"]); $s->movement = json_encode($data["movement"]); $s->save(); response()->json(['success' => 'success'], 200); } else { dd($validator->errors()); } } else { return new Response('Forbidden', 403); } } }
如果我使用 Postman 尝试此 Post 请求(我也尝试使用curl 和 python 的请求模块),我会收到 200 响应,并且数据以这种方式保存到数据库中。
问题出在“温度”、“压力”和“运动”字段上,更具体地说,是数组周围的双引号:由网络应用程序进行的涉及此数据的计算都是错误的,但是,如果我手动删除双引号(来自 PhpMyAdmin)计算是正确的。
为了完整起见,这里是表结构。
有没有办法避免这些字段周围出现双引号?
我的 POST 请求是否有问题,或者是后端相关的问题?
我不熟悉 PHP,但如果我没有记错的话,这些数据的处理应该由这些行管理:
$s->temperature = json_encode($data["temperature"]); $s->pressure = json_encode($data["pressure"]); $s->movement = json_encode($data["movement"]);
并且 json_encode 返回一个字符串,所以我开始认为后端代码在这里有问题,但我想要第二个意见。
提前致谢
编辑:好的,感谢 @samuel-olufemi 的回答和 @sumit 的评论,我可以得出结论,json_encode 与 MariaDB 使用的长文本数据类型相结合是主要问题。 所以我尝试存储数组值而不对其进行编码,将这 3 行更改为:
$s->temperature = $data["temperature"]; $s->pressure = $data["pressure"]; $s->movement = $data["movement"];
并且根据我的愿望,数据存储时没有双引号。感谢大家的帮助和时间。
您的实施是正确的。该问题是由于 Maria DB 长文本数据类型管理 JSON 数据的方式造成的。
你可以看看这个答案
https://dba.stackexchange .com/questions/192754/json-functions-double-quotes-added-when-going-through-a-variable