iT邦幫忙

2025 iThome 鐵人賽

DAY 8
0
Modern Web

Laravel 是甚麼系列 第 8

寫code用postman測試

  • 分享至 

  • xImage
  •  

測試POSTMAN
用https://dog.ceo/dog-api/網址

https://ithelp.ithome.com.tw/upload/images/20250811/20119035U4y6u3tiOe.png

貼上https://dog.ceo/api/breeds/image/random

https://ithelp.ithome.com.tw/upload/images/20250811/20119035F3ZtnwUmce.png

將https://images.dog.ceo/breeds/frise-bichon/1.jpg
貼到瀏覽器

https://ithelp.ithome.com.tw/upload/images/20250811/20119035zSEl0rXVGn.png

寫code用postman測試

https://ithelp.ithome.com.tw/upload/images/20250811/20119035vTIDMDDamA.png

上面寫

https://ithelp.ithome.com.tw/upload/images/20250811/201190352i6L70RVfj.png

程式碼

<?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
 
 ![https://ithelp.ithome.com.tw/upload/images/20250811/20119035QeKvfUoKIC.png](https://ithelp.ithome.com.tw/upload/images/20250811/20119035QeKvfUoKIC.png)
Postman測試localhost:8000/products

![https://ithelp.ithome.com.tw/upload/images/20250811/20119035cX1eoIPbdz.png](https://ithelp.ithome.com.tw/upload/images/20250811/20119035cX1eoIPbdz.png)
 
練習先取消在Middleware資料夾裡的VerifyCsrfToken
檢查就是加上*

![https://ithelp.ithome.com.tw/upload/images/20250811/20119035Tm5dTYvWeC.png](https://ithelp.ithome.com.tw/upload/images/20250811/20119035Tm5dTYvWeC.png)
 
Web.php的路徑只剩下
 
到ProductController新增
 ![https://ithelp.ithome.com.tw/upload/images/20250811/20119035Wbh2HsDjBj.png](https://ithelp.ithome.com.tw/upload/images/20250811/20119035Wbh2HsDjBj.png)
 
 ![https://ithelp.ithome.com.tw/upload/images/20250811/20119035qz5h7aymqj.png](https://ithelp.ithome.com.tw/upload/images/20250811/20119035qz5h7aymqj.png)



-----


寫store內的程式碼

public function store(Request $request)
{
$data = $this->getDate();
$newData = $request->all();
array_push($data,$newData);
return response($data);
}

```

以下是這段程式碼的解釋:
程式碼解釋

  1. public function store(Request $request)
    o 這是一個在 Laravel 控制器中的 store 方法,用於處理 HTTP POST 請求,通常用來新增資料。
    o Request $request 是一個 Laravel 的 Request 物件,包含了從用戶端傳來的所有請求資料,例如表單資料、檔案等等。
  2. $data = $this->getDate();
    o 使用 $this->getDate() 呼叫控制器中定義的 getDate 方法(假設這個方法已存在)。
    o getDate 方法應該返回一些資料(可能是一個陣列,例如從資料庫中讀取的資料)。
  3. $newData = $request->all();
    o 透過 $request->all() 獲取從用戶端傳來的所有請求資料,並將其存入 $newData。
    o $newData 是一個陣列,包含所有傳來的資料。
  4. array_push($data, $newData);
    o 使用 PHP 的 array_push 函數,將 $newData 加到 $data 陣列的末尾。
    o $data 會被更新,包含原始資料加上新的請求資料。
  5. return response($data);
    o 使用 Laravel 的 response 函數回傳 $data 作為 HTTP 回應。
    o 回應的內容是包含原始資料及新資料的陣列。

功能流程
• 從控制器內部呼叫 getDate 方法,獲取初始資料。
• 從用戶端取得請求資料,並與初始資料合併。
• 將合併後的資料作為回應返回給用戶端。


使用場景
假設你有一個待辦事項清單,getDate 方法返回現有的清單,前端通過 POST 請求傳來新項目,然後將新項目加入清單並返回更新後的完整清單。


潛在問題

  1. 未更新資料的來源:
    o $data 僅在記憶體中更新,沒有存回資料庫或其他來源。如果需要永久保存,需要明確處理資料存儲邏輯。
  2. 安全性問題:
    o 未驗證 $request->all() 的內容,可能帶來安全風險(例如 SQL Injection 或惡意資料)。
  3. getDate 方法依賴:
    o 必須確保 getDate 方法正確返回資料,否則此程式碼將無法運作。
    建議:
    • 驗證請求資料,例如使用 Laravel 的表單請求驗證。
    • 確認是否需要將更新後的資料存回資料庫。
    • 將處理邏輯改為更符合 RESTful API 的標準,避免直接操作陣列而忽略持久化存儲的需求。

https://ithelp.ithome.com.tw/upload/images/20250811/201190352DjFIFVP4J.png
要確認有在TERMINAL用php artisan serve跑起來
https://ithelp.ithome.com.tw/upload/images/20250811/201190351Q1k5cm3eq.png
執行POSTMAN顯示
https://ithelp.ithome.com.tw/upload/images/20250811/20119035oCL71KkkIq.png
POST網址localhost:8000/products
貼上的值
title:測試商品3
conten:這是一個很棒*2的商品
price:80

POST後網址localhost:8000/products?title=測試商品3&conten=這是一個很棒*2的商品&price=80
更新需要有id修改getData加入id參數跟collect
https://ithelp.ithome.com.tw/upload/images/20250811/20119035y8iJFk4nuM.png
寫更新的程式碼

用POSTMAN把id為0的資料變更:要選body為x-www-form-url..

從錯誤信息和代碼來看,問題出在 store 方法中,您使用 array_push($data, $newData); 將新數據加入 $data 集合。然而,array_push 函數要求第一個參數是數組,但 $data 是一個 Illuminate\Support\Collection(集合)。

修覆方法

您需要使用集合的方法(例如 pushadd)來操作 $data。修改如下:

public function store(Request $request)
{
    $data = $this->getDate(); // 獲取現有數據集合
    $newData = $request->all(); // 獲取 POST 請求的數據
    $data->push(collect($newData)); // 使用集合的 push 方法
    return response($data); // 返回更新後的集合
}

說明

  1. $data->push(collect($newData));

    • $data 是一個集合對象,直接調用其 push 方法,將新數據添加到集合中。
    • $newData 轉換為集合,以便與現有數據格式一致。
  2. 返回格式

    • 您的 getDate 返回的是一個集合,因此更新後仍返回集合,保持一致性。

測試

在 POSTMAN 中使用 POST 請求到 http://localhost:8000/products,並在 Body 中(選中 form-dataJSON 格式)傳遞如下數據進行測試:
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 的集合對象。推薦在集合上使用內置的操作方法,例如 pushmergeadd

https://ithelp.ithome.com.tw/upload/images/20250811/20119035oqOzSjrpLW.png

public function store(Request $request)
{
    $data = $this->getDate(); // 獲取現有数据集合
    $newData = $request->all(); // 獲取 POST 请求的數據
    $data->push(collect($newData)); // 使用集合的 push 方法
    return response($data); // 返回更新後的集合
}


用POSTMAN測試
https://ithelp.ithome.com.tw/upload/images/20250811/20119035KM2nypXPjI.png
更新:
https://ithelp.ithome.com.tw/upload/images/20250811/20119035v8q0JQnRfR.png

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 的數據項。以下是逐行的解析:

1. public function update(Request $request, $id)

  • 定義了一個 update 方法,用於處理更新操作。
  • 參數:
    • $request:包含從客戶端接收到的 HTTP 請求數據(通常是表單數據或 JSON)。
    • $id:傳入的標識符,用於找到需要更新的具體數據。

2. $form = $request->all();

  • 作用:從請求中提取所有輸入數據,並存儲到 $form 變量中。
  • 數據類型$form 是一個數組,包含請求中的所有字段及其值。

3. $data = $this->getDate();

  • 作用:調用類的 getDate 方法以獲取原始數據集合。
  • 假設getDate 方法返回的數據是一個可叠代的集合對象(如 Laravel 的 Collection)。

4. $selecteData = $data->where('id', $id)->first();

  • 作用:在 $data 集合中,查找符合條件的第一個數據項。
    • where('id', $id):篩選 id 等於 $id 的數據。
    • first():返回篩選結果中的第一項。
  • 數據類型:如果找到匹配項,$selecteData 是一個集合對象或數組;如果沒有匹配項,則為 null

5. $selecteData = $selecteData->merge(collect($form));

  • 作用:將 $form 轉換為集合,並與 $selecteData 合並。
    • collect($form):將數組 $form 轉換為 Laravel 的集合。
    • merge():用 $form 中的鍵值覆蓋 $selecteData 中的鍵值,或添加新鍵值。
  • 結果:更新後的 $selecteData 包含原數據和請求中的新數據。

6. return response($selecteData);

  • 作用:將更新後的數據通過 HTTP 響應返回給客戶端。
    • $selecteData 會作為 JSON 數據返回。

完整執行流程:

  1. 從請求中獲取表單數據($form)。
  2. 從現有數據集合中,根據 id 找到目標數據項。
  3. 將表單數據與目標數據項合並,完成更新。
  4. 將更新後的數據返回給客戶端。

可能的改進點:

  1. 驗證輸入數據
    使用 Laravel 的驗證功能,確保請求中的數據有效。例如:

    $request->validate([
        'title' => 'required|string|max:255',
        'content' => 'required|string',
        'price' => 'required|numeric|min:0',
    ]);
    
  2. 錯誤處理
    如果找不到指定 id 的數據,應返回適當的錯誤響應。例如:

    if (!$selecteData) {
        return response()->json(['error' => 'Data not found'], 404);
    }
    
  3. 保存更新數據
    當前代碼只處理內存中的數據更新,沒有將更新後的數據存儲到數據庫或其他持久化存儲中。可以通過數據庫模型完成保存。

如果還有其他不理解的部分,可以繼續提問!


用POSTMAN測試localhost:8000/products/0
https://ithelp.ithome.com.tw/upload/images/20250811/20119035snXOHhEZp5.png
刪除

https://ithelp.ithome.com.tw/upload/images/20250811/20119035z7UQFLSxmE.png

public function destroy($id)
{
   $data = $this->getDate();
   $data = $data->filter(function ($product) use ($id) {
       return $product['id'] != $id;
   });

   return response($data->values());
}

修正代碼的解釋:

  1. $data = $this->getDate();
    從 getDate 方法中獲取數據,假設其返回一個 Collection(集合)。

  2. $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,留下沒有被刪除的
https://ithelp.ithome.com.tw/upload/images/20250811/20119035GPccQWpZZ0.png
大家明天見~


上一篇
繼續安裝
下一篇
裝mysql
系列文
Laravel 是甚麼30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言