我嘗試向端點發送 POST 請求,收到 200 回應,但我發送的資料錯誤地保存在資料庫中;
我想知道問題是出在我的 post 請求上還是出在處理該請求的後端程式碼。
更具體地說:我正在向 Laravel MariaDB 後端發送 POST 請求。我沒有編寫後端程式碼,我得到的所有“細節”是:
post請求有3個欄位:
- user_id:病患 ID
- 密碼:病患密碼(所有病患均相同)
- payload:一個 json 有效負載,其架構如下:
- 'epoch_start' => '必填|數字',
- 'epoch_end' => 'required|numeric|gte:epoch_start',
- '大小' => '必要|數字|gt:0',
- #'溫度' => '必需|陣列|最小:大小',
- '壓力' => '必要|陣列|最小:大小',
- '移動' => '必需|陣列|最小:大小',
這是處理請求的控制器:
has(['user_id', '密碼', '有效負載'])) { $password = $request->get('password'); $user_id = $request->get('user_id'); $user = User::where('id', $user_id)->firstOrFail(); if($user->role != "病人") return new Response('Forbidden', 403); if($password != "HIDDENPASS") return new Response('Forbidden', 403); $payload = $request->get('payload'); $data = json_decode($payload, true); $規則= [ '紀元開始' => '必填|數位', '紀元結束' => '必需|數|gte:epoch_start', '尺寸' => '必填|數|gt:0', '溫度' => '必需|陣列|最小值:大小', '壓力' => '必需|陣列|最小值:大小', '運動' => '必需|陣列|最小值:大小', '溫度。*' => '數字', '壓力。*' => '數字', '運動。*' => '數字', ]; $validator = Validator::make($data, $rules); if ($validator->passes()) { $s = 新感測器; $s->user_id = $user->id; $s->epoch_start = Carbon::parse($data["epoch_start"]); $s->epoch_end = Carbon::parse($data["epoch_end"]); $s->大小 = $data["大小"]; $s->溫度 = json_encode($data["溫度"]); $s->壓力 = json_encode($data["壓力"]); $s->movement = json_encode($data["movement"]); $s->儲存(); 響應()->json(['成功'=>'成功'], 200); } 別的 { dd($validator->errors()); } } 別的 { 返回新的回應('禁止',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
#