測試POSTMAN
用https://dog.ceo/dog-api/網址
貼上https://dog.ceo/api/breeds/image/random
將https://images.dog.ceo/breeds/frise-bichon/1.jpg
貼到瀏覽器
寫code用postman測試
上面寫
程式碼
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class ProductController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index(Request $request)
{
//
$data = $this->getDate();
return response($data);
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
//
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
}
/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
//
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function edit($id)
{
//
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
//
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id)
{
//
}
public function getDate()
{
return [
[
'title' => '測試商品一',
'content' => '這是一個很棒的商品',
'price' => 50
],
[
'title' => '測試商品2',
'content' => '這是一個棒的商品',
'price' => 30
],
];
}
}
```
-----
用下面執行: php artisan serve

Postman測試localhost:8000/products

練習先取消在Middleware資料夾裡的VerifyCsrfToken
檢查就是加上*

Web.php的路徑只剩下
到ProductController新增


-----
寫store內的程式碼
public function store(Request $request)
{
$data = $this->getDate();
$newData = $request->all();
array_push($data,$newData);
return response($data);
}
```
以下是這段程式碼的解釋:
程式碼解釋
功能流程
• 從控制器內部呼叫 getDate 方法,獲取初始資料。
• 從用戶端取得請求資料,並與初始資料合併。
• 將合併後的資料作為回應返回給用戶端。
使用場景
假設你有一個待辦事項清單,getDate 方法返回現有的清單,前端通過 POST 請求傳來新項目,然後將新項目加入清單並返回更新後的完整清單。
潛在問題
要確認有在TERMINAL用php artisan serve跑起來
執行POSTMAN顯示
POST網址localhost:8000/products
貼上的值
title:測試商品3
conten:這是一個很棒*2的商品
price:80
POST後網址localhost:8000/products?title=測試商品3&conten=這是一個很棒*2的商品&price=80
更新需要有id修改getData加入id參數跟collect
寫更新的程式碼
用POSTMAN把id為0的資料變更:要選body為x-www-form-url..
從錯誤信息和代碼來看,問題出在 store
方法中,您使用 array_push($data, $newData);
將新數據加入 $data
集合。然而,array_push
函數要求第一個參數是數組,但 $data
是一個 Illuminate\Support\Collection
(集合)。
您需要使用集合的方法(例如 push
或 add
)來操作 $data
。修改如下:
public function store(Request $request)
{
$data = $this->getDate(); // 獲取現有數據集合
$newData = $request->all(); // 獲取 POST 請求的數據
$data->push(collect($newData)); // 使用集合的 push 方法
return response($data); // 返回更新後的集合
}
$data->push(collect($newData));
:
$data
是一個集合對象,直接調用其 push
方法,將新數據添加到集合中。$newData
轉換為集合,以便與現有數據格式一致。返回格式:
getDate
返回的是一個集合,因此更新後仍返回集合,保持一致性。在 POSTMAN 中使用 POST
請求到 http://localhost:8000/products
,並在 Body
中(選中 form-data
或 JSON
格式)傳遞如下數據進行測試:
json
{
"id": 2,
"title": "測試商品三",
"content": "這是一個非常棒的商品",
"price": 100
}
返回示例:
json
[
{
"id": 0,
"title": "測試商品一",
"content": "這是一個很棒的商品",
"price": 50
},
{
"id": 1,
"title": "測試商品2",
"content": "這是一個棒的商品",
"price": 30
},
{
"id": 2,
"title": "測試商品三",
"content": "這是一個非常棒的商品",
"price": 100
}
]
array_push
是針對原生 PHP 數組的操作,不適用於 Laravel 的集合對象。推薦在集合上使用內置的操作方法,例如 push
、merge
或 add
。
public function store(Request $request)
{
$data = $this->getDate(); // 獲取現有数据集合
$newData = $request->all(); // 獲取 POST 请求的數據
$data->push(collect($newData)); // 使用集合的 push 方法
return response($data); // 返回更新後的集合
}
用POSTMAN測試
更新:
public function update(Request $request, $id)
{
$form = $request->all();
$data = $this ->getDate();
$selecteData = $data->where('id',$id)->first();
$selecteData = $selecteData->merge(collect($form));
return response($selecteData);
}
這段代碼的功能是更新指定 id
的數據項。以下是逐行的解析:
public function update(Request $request, $id)
update
方法,用於處理更新操作。$request
:包含從客戶端接收到的 HTTP 請求數據(通常是表單數據或 JSON)。$id
:傳入的標識符,用於找到需要更新的具體數據。$form = $request->all();
$form
變量中。$form
是一個數組,包含請求中的所有字段及其值。$data = $this->getDate();
getDate
方法以獲取原始數據集合。getDate
方法返回的數據是一個可叠代的集合對象(如 Laravel 的 Collection
)。$selecteData = $data->where('id', $id)->first();
$data
集合中,查找符合條件的第一個數據項。
where('id', $id)
:篩選 id
等於 $id
的數據。first()
:返回篩選結果中的第一項。$selecteData
是一個集合對象或數組;如果沒有匹配項,則為 null
。$selecteData = $selecteData->merge(collect($form));
$form
轉換為集合,並與 $selecteData
合並。
collect($form)
:將數組 $form
轉換為 Laravel 的集合。merge()
:用 $form
中的鍵值覆蓋 $selecteData
中的鍵值,或添加新鍵值。$selecteData
包含原數據和請求中的新數據。return response($selecteData);
$selecteData
會作為 JSON 數據返回。$form
)。id
找到目標數據項。驗證輸入數據:
使用 Laravel 的驗證功能,確保請求中的數據有效。例如:
$request->validate([
'title' => 'required|string|max:255',
'content' => 'required|string',
'price' => 'required|numeric|min:0',
]);
錯誤處理:
如果找不到指定 id
的數據,應返回適當的錯誤響應。例如:
if (!$selecteData) {
return response()->json(['error' => 'Data not found'], 404);
}
保存更新數據:
當前代碼只處理內存中的數據更新,沒有將更新後的數據存儲到數據庫或其他持久化存儲中。可以通過數據庫模型完成保存。
如果還有其他不理解的部分,可以繼續提問!
用POSTMAN測試localhost:8000/products/0
刪除
public function destroy($id)
{
$data = $this->getDate();
$data = $data->filter(function ($product) use ($id) {
return $product['id'] != $id;
});
return response($data->values());
}
修正代碼的解釋:
$data = $this->getDate();
從 getDate 方法中獲取數據,假設其返回一個 Collection(集合)。
$data = $data->filter(function ($product) use ($id) {...});
作用:過濾集合中的數據,移除 id 等於 $id 的數據項。
filter 方法:遍歷集合中的每個元素,並將通過條件的元素保留。
use ($id):將外部變量 $id 引入匿名函數中使用。
條件邏輯:
return $product['id'] != $id;
如果當前 product 的 id 不等於 $id,保留該數據。
否則,移除該數據。
3. return response($data->values());
作用:返回過濾後的數據集合。
values 方法:
將集合的鍵重置為連續的數字索引。
確保返回的結果是一個 JSON 格式的數組。
改進建議:
檢查數據類型: 確保 getDate 方法返回的是一個 Collection 對象。如果是數組,可以用 collect($data) 轉換為集合:
$data = collect($this->getDate());
數據驗證: 在調用 filter 前,可以驗證 $id 是否有效:
if (!is_numeric($id)) {
return response()->json(['error' => 'Invalid ID'], 400);
}
檢查數據是否存在: 如果過濾後集合為空,可以返回一個合適的響應:
if ($data->isEmpty()) {
return response()->json(['message' => 'No data found'], 404);
}
用POSTMAN測試delete在localhost:8000/products/1,留下沒有被刪除的
大家明天見~