Permintaan POST berjaya, tetapi data telah disimpan dengan cara yang salah
P粉317679342
P粉317679342 2024-02-26 17:59:55
0
1
412

Saya cuba menghantar permintaan POST ke titik akhir dan menerima 200 respons, tetapi data yang saya hantar telah tersilap disimpan dalam pangkalan data;

Saya ingin tahu sama ada masalahnya adalah dengan permintaan pos saya atau dengan kod bahagian belakang yang mengendalikan permintaan tersebut.

Lebih khusus lagi: Saya menghantar permintaan POST ke bahagian belakang Laravel + MariaDB. Saya tidak menulis kod bahagian belakang, semua "butiran" yang saya dapat ialah:

Permintaan pos mempunyai 3 medan:

  • user_id: ID pesakit
  • Kata Laluan: Kata laluan pesakit (sama untuk semua pesakit)
  • muatan: muatan json dengan struktur berikut:
    • 'epoch_start' => 'Diperlukan|Nombor',
    • 'epoch_end' => 'diperlukan|numeric|gte:epoch_start',
    • 'Saiz' => 'Diperlukan|Nombor|gt:0',
    • 'Suhu' => 'Diperlukan|Susunatur|Minimum: saiz',
    • 'Pressure' => 'Diperlukan|Array|Minimum: saiz',
    • 'Move' => 'Diperlukan|Array|Min:Saiz',

Ini ialah pengawal yang mengendalikan permintaan:

<?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);
        }  
    }
}

Jika saya mencuba permintaan Pos ini menggunakan Posman (saya juga cuba menggunakan modul permintaan curl dan python), saya mendapat 200 respons dan data disimpan ke pangkalan data dengan cara ini.

Masalahnya ialah dengan medan "Suhu", "Tekanan" dan "Pergerakan", lebih khusus petikan berganda di sekeliling tatasusunan: pengiraan yang dilakukan oleh aplikasi web yang melibatkan data ini semuanya salah, namun, jika saya mengalih keluar dua kali secara manual sebut harga (dari PhpMyAdmin) pengiraan adalah betul.

Untuk kesempurnaan, berikut adalah struktur jadual.

Adakah terdapat cara untuk mengelakkan petikan berganda di sekitar medan ini?

Adakah terdapat masalah dengan permintaan POST saya, atau adakah ia isu berkaitan bahagian belakang?

Saya tidak biasa dengan PHP, tetapi jika saya ingat dengan betul, pemprosesan data ini harus diuruskan oleh baris ini:

$s->temperature = json_encode($data["temperature"]);
$s->pressure = json_encode($data["pressure"]);
$s->movement = json_encode($data["movement"]);

Dan json_encode mengembalikan rentetan, jadi saya mula fikir ada yang tidak kena dengan kod hujung belakang di sini, tetapi saya ingin pendapat kedua.

Terima kasih terlebih dahulu

EDIT: Ok, terima kasih kepada jawapan @samuel-olufemi dan komen @sumit, saya boleh menyimpulkan bahawa json_encode digabungkan dengan jenis data teks panjang yang digunakan oleh MariaDB adalah masalah utama. Jadi saya cuba menyimpan nilai tatasusunan tanpa mengekodnya, menukar 3 baris ini kepada:

$s->temperature = $data["temperature"];
$s->pressure = $data["pressure"];
$s->movement = $data["movement"];

Dan mengikut kehendak saya, data disimpan tanpa petikan berganda. Terima kasih atas bantuan dan masa semua orang.

P粉317679342
P粉317679342

membalas semua(1)
P粉794177659

Pelaksanaan anda betul. Isu ini disebabkan oleh cara jenis data teks panjang Maria DB mengurus data JSON.

Anda boleh lihat jawapan ini

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

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan