首页  >  问答  >  正文

POST请求成功,但数据保存方式错误

我尝试向端点发送 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"];

并且根据我的愿望,数据存储时没有双引号。感谢大家的帮助和时间。

P粉317679342P粉317679342210 天前307

全部回复(1)我来回复

  • P粉794177659

    P粉7941776592024-02-27 17:25:09

    您的实施是正确的。该问题是由于 Maria DB 长文本数据类型管理 JSON 数据的方式造成的。

    你可以看看这个答案

    https://dba.stackexchange .com/questions/192754/json-functions-double-quotes-added-when-going-through-a-variable

    回复
    0
  • 取消回复