---
# System prepended metadata

title: 其他功能 規格書想法
tags: [會議記錄]

---

其他功能大致流程
===

```sequence
UI->其他功能: 點擊某些區域，呼叫提供的方法
Note right of 其他功能: 確認資料
Note right of 其他功能: 邏輯處理
Note right of 其他功能: 準備Request資料
Note right of 其他功能: RequestwebRequestManager.SendRequest
其他功能->伺服器: Post Request
Note right of 伺服器: 接收資料(PHP)
Note right of 伺服器: 邏輯處理
Note right of 伺服器: 資料庫操作(PHP+DB)
Note right of 伺服器: 回傳資料(PHP)
伺服器->其他功能: 回傳資料
Note left of 其他功能: 解讀資料
其他功能->UI: 操作結果
```

UI和伺服器的部分交給 #設計 以及 #外部 處理
負責其他功能的組員應該提供一些資訊給其他部門處理：

#設計：方法的名稱、可以傳入的參數，以及所有可能回傳的結果

#外部：Request 的方法以及內容、想要收到的資料格式
（e.g., 伺服器判斷抽卡成功，回傳結果應該要有卡片id等等）

---

其他功能的規格書
===

請見 #其他功能會議記錄&規格書提案

---
For 內部參考
===
## HTTP Request

### 大家可以一起使用的方法


```c#
 webRequestManager.SendRequest(endpoint, method, requestData, callbackResponse);
```
1. endpoint：表示伺服器上要執行的特定操作。伺服器上有多個不同的 API 端點，每個端點對應不同的操作或資源。這個參數指定了特定端點，以便伺服器知道應該執行什麼操作。

2. method：HTTP 請求的方法，通常是 "GET" 或 "POST"。
HTTP 方法指定了客戶端希望對伺服器執行的操作類型，由本組別設計。

3. requestData：這是包含要傳送到伺服器的數據的字符串。具體的內容和格式取決於不同的功能，由本組別設計。


4. callbackResponse：這是一個回調函數，它指定了當伺服器回應完成後應該執行的客戶端程式碼。回調函數接受一個字符串參數，該參數是從伺服器接收到的回應數據。

---
一個小小的例子
```c#
using UnityEngine;

public class LoginManager : MonoBehaviour
{
    public WebRequestManager webRequestManager;

    // 當用戶按下登入按鈕時呼叫此函數，並傳入帳號和密碼
    public void OnLoginButtonClick(string username, string password)
    {
        // 設定登入請求的相關參數
        string endpoint = "login";
        string method = "POST";
        string requestData = "username=" + username + "&password=" + password;

        // 呼叫通用的HTTP請求函數，處理伺服器回應
        webRequestManager.SendRequest(endpoint, method, requestData, HandleLoginResponse);
    }

    // 處理伺服器登入回應，返回不同的字符串值表示不同的登入結果
    private string HandleLoginResponse(string response)
    {
        if (response == "Success")
        {
            // 登入成功，返回 "Success"
            return "Success";
        }
        else if (response == "InvalidUsername")
        {
            // 帳號錯誤，返回 "InvalidUsername"
            return "InvalidUsername";
        }
        else if (response == "InvalidPassword")
        {
            // 密碼錯誤，返回 "InvalidPassword"
            return "InvalidPassword";
        }
        else if (response == "AccountNotFound")
        {
            // 無此帳號，返回 "AccountNotFound"
            return "AccountNotFound";
        }
        else
        {
            // 其他情況，返回 "UnknownError"
            return "UnknownError";
        }
    }

}

```

---
WebRequestManager.cs
```C#
using UnityEngine;
using UnityEngine.Networking;
using System;
using System.Collections;

public class WebRequestManager : MonoBehaviour
{
    private string serverURL = ""; // 伺服器基本URL

    // 通用的HTTP請求函數
    public void SendRequest(string endpoint, string method, string requestData, Action<string> callback)
    {
        StartCoroutine(SendRequestCoroutine(endpoint, method, requestData, callback));
    }

    private IEnumerator SendRequestCoroutine(string endpoint, string method, string requestData, Action<string> callback)
    {
        string requestURL = serverURL + "/" + endpoint;

        UnityWebRequest www = null;

        if (method == "GET")
        {
            requestURL += requestData;
            www = UnityWebRequest.Get(requestURL);
        }
        else if (method == "POST")
        {
            www = UnityWebRequest.Post(requestURL, requestData);
        }

        if (www == null)
        {
            Debug.LogError("無效的HTTP請求方法：" + method);
            yield break;
        }

        // 設置安全性證書校驗，如果使用的是自簽名證書，需要將此設置為false
        www.certificateHandler = new BypassCertificate();

        yield return www.SendWebRequest();

        if (www.result == UnityWebRequest.Result.Success)
        {
            string response = www.downloadHandler.text;
            callback(response);
        }
        else
        {
            Debug.LogError("請求失敗：" + www.error);
        }
    }
}

```