如何開發應用程式將客戶伺服器資料庫的備份,下載到本地的雲服務上?

来源:http://www.cnblogs.com/liuzhifengxy/archive/2016/11/17/6074437.html
-Advertisement-
Play Games

恢復內容開始 如何做到將客戶伺服器資料庫的備份,下載到本地的雲服務上? 在開發這個程式中中途也遇到了一下問題,下麵我將自己如何進解決的辦法寫出來供大家參考。 一.首先我需要進行描述一下問題: 1.比如有兩台伺服器A,B(雲伺服器) 將A中的伺服器中的資料庫的備份進行下載到B的雲服務中並保存。 2.當 ...


---恢復內容開始---

如何做到將客戶伺服器資料庫的備份,下載到本地的雲服務上? 在開發這個程式中中途也遇到了一下問題,下麵我將自己如何進解決的辦法寫出來供大家參考。

一.首先我需要進行描述一下問題:

1.比如有兩台伺服器A,B(雲伺服器) 將A中的伺服器中的資料庫的備份進行下載到B的雲服務中並保存。

2.當然這台A伺服器的外網是可以進行訪問,如果外網訪問不了的話,那也是沒有辦法的。

3.然後在B伺服器中定期的進行刪除資料庫備份,定時的下載。併進行保存最新一個星期的資料庫備份。

4.在雲服務需要保存最新的資料庫備份,當然不止一個資料庫備份了,併進行定期的刪除以及下載。

二:遇到的一些問題:

1.WebServices安全通道建立信任關係的異常。

2.資料庫備份過大問題,無法下載。採用文件流的方式進行壓縮。

3.在做定時刪除以及下載的程式的時候使用Windows服務開發還是使用控制台然後掛在任務計劃程式上。

4.如何進行讀或者取資料庫備份。通過FilesGetter.GetFiles(_fileDir, filter)方法。

5.壓縮問題等等。應用BZip2.Compress(srcFile, zipFile, 8192);進行壓縮以8M為一個壓縮塊。

6.備份策略,每天,每周,每月。應用任務計劃程式。

二:需要的使用那些技術:

1.經過考慮了一下需要創建一個WebServices。

2.需要創建3個控制台應用程式其中分別包括(下載控制台應用程式,刪除的控制台應用程式,壓縮的控制台應用程式)。

3.文件流的使用,webClient 的應用等等

三:整個下載過程的流程圖

 

四:各個模塊的代碼

1.先進行通過控制台應用程式進行對客戶伺服器的資料庫備份進行壓縮。

 

  1  class Program
  2     {
  3         static void Main(string[] args)
  4         {
  5             string fileDir = Properties.Settings.Default.DB_FILE_PATH;//客戶的伺服器的資料庫備份文件的路徑
  6 
  7             string saveCompress = Properties.Settings.Default.DB_COMPRESS_PATH;
  8             try
  9             { 
 10             #region 1.資料庫文件所在伺服器的目錄的位置
 11             if (string.IsNullOrEmpty(fileDir) || !Directory.Exists(fileDir))
 12             {
 13                 throw new Exception("配置文件目錄不正確,請檢查" + fileDir);
 14             }
 15             #endregion
 16             #region 2.進行獲取其中的壓縮後的所有的文件
 17             string[] dir = new string[] { "*.001" };
 18             List<string> dbFileUrl = new List<string>();
 19             if (dir != null)
 20             {
 21                 foreach (var filter in dir)
 22                 {
 23                     dbFileUrl.AddRange(FilesGetter.GetFiles(fileDir, filter));
 24                 }
 25             }
 26             #endregion
 27             #region 3.引用第三方進行壓縮文件並將文件放到指定的壓縮的目錄下麵
 28             if (dbFileUrl != null)
 29             {
 30                 foreach (var url in dbFileUrl)
 31                 {
 32                     //引用第三方的ZIP壓縮的方法進行壓縮文件並將壓縮的文件進行保存到客戶的伺服器的指定的目錄下麵
 33                     string zipDownUrl = saveCompress + Path.GetFileName(url) + ".rar";
 34                     //進行壓縮文件越大那麼壓縮的時間越長
 35                     if (url != null && zipDownUrl != null)
 36                     {
 37                         Console.WriteLine("資料庫{0}文件{1}壓縮開始", Path.GetFileName(url),DateTime.Now);
 38                         if (BZipFile(url, zipDownUrl) == true)
 39                         {
 40                             using (StreamWriter sw = new StreamWriter(saveCompress + "資料庫備份壓縮日誌.txt", true))
 41                             {
 42                                 sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ") + "資料庫備份壓縮開始" + "資料庫的備份的文件壓縮的文件的名稱:" + Path.GetFileName(url) + "資料庫備份壓縮的路徑:" + fileDir);
 43                             }
 44                             Console.WriteLine("資料庫{0}文件{1}壓縮結束", Path.GetFileName(url), DateTime.Now);
 45                         }
 46                         else
 47                         {
 48                             Console.WriteLine("資料庫文件壓縮失敗!");
 49                         }
 50                     }
 51                     else
 52                     {
 53                         Console.WriteLine("資料庫文件壓縮失敗!");
 54                     }
 55                 }
 56                 //當所有的資料庫備份文件壓縮完成後那麼將壓縮的日誌進行寫入到記事本中
 57                 using (StreamWriter sw = new StreamWriter(saveCompress + "資料庫備份壓縮日誌.txt", true))
 58                 {
 59                     sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ") + "資料庫備份壓縮結束");
 60                 }
 61             }
 62 
 63             #endregion
 64             }
 65             catch(Exception  ex)
 66             {
 67                 //將資料庫備份的日誌寫入到記事本中去
 68                 using (StreamWriter sw = new StreamWriter(saveCompress + "資料庫備份壓縮日誌.txt", true))
 69                 {
 70                     sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "資料庫備份的壓縮中進行捕捉的異常" + ex.Message);
 71                 }
 72             }
 73             
 74         }
 75 
 76         /// <summary>
 77         ///進行壓縮資料庫的備份的文件
 78         /// </summary>
 79         /// <param name="sourcefilename"></param>
 80         /// <param name="zipfilename"></param>
 81         /// <returns></returns>
 82         public static bool BZipFile(string sourcefilename, string zipfilename)
 83         {
 84             bool blResult;//表示壓縮是否成功的返回結果
 85             //為源文件創建文件流實例,作為壓縮方法的輸入流參數
 86             FileStream srcFile = File.OpenRead(sourcefilename);
 87             //為壓縮文件創建文件流實例,作為壓縮方法的輸出流參數
 88             FileStream zipFile = File.Open(zipfilename, FileMode.Create);
 89             try
 90             {
 91                 //以8192節作為一個塊的方式壓縮文件8M一塊進行壓縮
 92                 BZip2.Compress(srcFile, zipFile, 8192);
 93                 blResult = true;
 94             }
 95             catch (Exception ex)
 96             {
 97                 Console.WriteLine(ex.Message);
 98                 blResult = false;
 99             }
100             srcFile.Close();//關閉源文件流
101             zipFile.Close();//關閉壓縮文件流
102             return blResult;
103         }
104     }
通過創建一個控制台來進行壓縮資料庫備份文件

 

2.讀取客戶伺服器資料庫的備份壓縮文件的名稱,通過拼接一個下載的路徑URL,返回多個資料庫備份文件路徑的集合。

 

  1 namespace DBDownLoad.Server.Services
  2 {
  3     /// <summary>
  4     /// Summary description for DbFileProvider
  5     /// </summary>
  6     [WebService(Namespace = "http://tempuri.org/")]
  7     [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
  8     [System.ComponentModel.ToolboxItem(false)]
  9     public class DbFileProvider : System.Web.Services.WebService
 10     {
 11         private static string _fileDir;
 12         private static string _rootUrl;
 13         [WebMethod]
 14         public List<string> GetDbFile()
 15         {
 16             //對方客戶的資料庫文件所在伺服器的目錄的位置
 17             _fileDir = System.Configuration.ConfigurationManager.AppSettings["DbBackupFilePath"];
 18             //實現文件下載地址的拼接 將所有的資料庫的文件進行下載後然後進行其中的文件的拼接。
 19             _rootUrl = System.Configuration.ConfigurationManager.AppSettings["DbBackupFileRootUrl"];
 20             #region 1.資料庫文件所在伺服器的目錄的位置
 21             List<string> displayUrlList = new List<string>();
 22             if (string.IsNullOrEmpty(_fileDir) || !Directory.Exists(_fileDir))
 23             {
 24                 throw new Exception("配置文件目錄不正確,請檢查" + _fileDir);
 25             }
 26             #endregion
 27             #region 2.確定其中的文件是否下載成功
 28             string[] txt = new string[] { "*.txt" };
 29             List<string> dbTxt = new List<string>();
 30             if (txt != null)
 31             {
 32                 foreach (var items in txt)
 33                 {
 34                     dbTxt.AddRange(FilesGetter.GetFiles(_fileDir, items));
 35                 }
 36             }
 37             #endregion
 38             if (dbTxt.Count()>0)
 39             {
 40                 #region 3.進行獲取其中的壓縮後的所有的文件
 41             string[] dir = new string[] { "*.rar" };
 42             List<string> dbFileUrl = new List<string>();
 43             if (dir != null)
 44             {
 45                 foreach (var filter in dir)
 46                 {
 47                     dbFileUrl.AddRange(FilesGetter.GetFiles(_fileDir, filter));
 48                 }
 49             }
 50             #endregion
 51                 #region 4.進行獲取備份文件的文件名和時間的集合
 52             List<DBNameAndTime> dbFileNameList = new List<DBNameAndTime>();
 53             if (dbFileUrl != null)
 54             {
 55                 foreach (var url in dbFileUrl)
 56                 {
 57                     FileInfo fi = new FileInfo(url);
 58                     DBNameAndTime file = new DBNameAndTime();
 59                     file.FileName = fi.Name;// 文件名
 60                     file.FileTime = fi.LastWriteTime;// 文件時間
 61                     file.Url = url;
 62                     //進行獲取資料庫名稱
 63                     var strArr = fi.Name.Split('.');
 64                     if (strArr.Length > 0)
 65                     {
 66                         //分離其中的文件的名稱
 67                         file.DataName = strArr[0].ToString();
 68                     }
 69                     if (file != null)
 70                     {
 71                         dbFileNameList.Add(file);
 72                     }
 73                 }
 74             }
 75             #endregion
 76                 #region   5.進行獲取備份文件的資料庫名稱的集合
 77             List<string> dataNameList = new List<string>();
 78             foreach (var item in dbFileNameList)
 79             {
 80                 if (!dataNameList.Contains(item.DataName))
 81                 {
 82                     dataNameList.Add(item.DataName);
 83                 }
 84             }
 85             #endregion
 86                 #region  6.進行遍曆數據庫名稱集合,獲取到每個資料庫備份的最新的文件路徑
 87            
 88             foreach (var dataName in dataNameList)
 89             {
 90                 //第一步將每個資料庫的備份找出來
 91                 List<DBNameAndTime> tempList = new List<DBNameAndTime>();
 92                 foreach (var fileName in dbFileNameList)
 93                 {
 94                     if (dataName == fileName.DataName)
 95                     {
 96                         tempList.Add(fileName);
 97                     }
 98                 }
 99                 //第二步篩選出最新的文件
100                 var newFile = tempList.OrderByDescending(a => a.FileTime).FirstOrDefault();
101 
102                 //第三步將最新的文件的路徑添加到要下載的集合中
103                 if (newFile != null)
104                 {
105                     //進行返回下載的文件的URL的壓縮包格式的文件
106                     string downUrl = newFile.DownUrl;
107                     displayUrlList.Add(downUrl);
108                 }
109             }
110             #endregion
111             }
112             return displayUrlList;
113         }
114 
115         //進行聲明備份資料庫的類
116         public class DBNameAndTime
117         {
118             private string fileName;
119             /// <summary>
120             /// 文件名稱
121             /// </summary>
122             public string FileName { get { return fileName; } set { fileName = value; } }
123 
124             private DateTime fileTime;
125             /// <summary>
126             /// 文件的最後修改時間
127             /// </summary>
128             public DateTime FileTime { get { return fileTime; } set { fileTime = value; } }
129 
130             private string dataName;
131             /// <summary>
132             /// 資料庫名稱
133             /// </summary>
134             public string DataName { get { return dataName; } set { dataName = value; } }
135 
136             private string url;
137             /// <summary>
138             /// 文件路徑
139             /// </summary>
140             public string Url { get { return url; } set { url = value; } }
141 
142             public string DownUrl { get { return _rootUrl + fileName; } }
143         }
144     }
145 }
應用WebServices進行開發應用程式來返回下載路徑的集合

 

3.創建控制台應用程式進行遠程下載通過獲取WebServices 返回的List<string> 進行下載

 1  class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             //通過代碼進行建立SSL認證關係否則會出現未能為 SSL/TLS 安全通道建立信任關係.
 6             ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true;
 7             ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(delegate { return true; });
 8             WebClient client = new WebClient();
 9             DbFileUrlProviderSvc.DbFileProviderSoapClient svcClient = new DbFileUrlProviderSvc.DbFileProviderSoapClient();
10             DbFileUrlProviderSvc.ArrayOfString latstFileUrlArray = svcClient.GetDbFile();
11             string receivePath = Properties.Settings.Default.LOCAL_PATH;//公司的雲伺服器保存下載文件的路徑
12             try
13             {
14                 // 對從svc取出的url迴圈下載獲取最新的文件
15                 if (receivePath != null)
16                 {
17                     if (latstFileUrlArray != null)
18                     {
19                         foreach (var downloadPath in latstFileUrlArray.ToList())
20                         {
21                             //將下載的文件進行保存到指定的文件夾
22                             if (downloadPath != null)
23                             {
24                                 //將資料庫備份的日誌寫入到記事本中去
25                                 using (StreamWriter sw = new StreamWriter(receivePath + "資料庫下載的日誌.txt", true))
26                                 {
27                                     sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "資料庫備份下載開始:" + "下載的路徑:" + downloadPath + "接收的路徑:" + receivePath + "下載文件的名稱:" + Path.GetFileName(downloadPath));
28                                 }
29                                 //下載資料庫備份文件
30                                 Console.WriteLine("資料庫備份壓縮包下載開始{0}!", DateTime.Now.ToString("yyyy-MM-dd-HH:mm:ss"));
31                                 client.DownloadFile(downloadPath, receivePath + Path.GetFileName(downloadPath));
32                                 Console.WriteLine("恭喜你備份{0}文件時間{1}下載完成,進入本地{2}下麵進行查看!", Path.GetFileName(downloadPath), DateTime.Now.ToString("yyyy-MM-dd-HH:mm:ss"), receivePath);
33                             }
34                         }
35                     }
36                 }
37             }
38             catch(Exception ex)
39             {
40                 //將資料庫備份的日誌寫入到記事本中去
41                 using (StreamWriter sw = new StreamWriter(receivePath + "資料庫下載的日誌.txt", true))
42                 {
43                     sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "資料庫備份下載中進行捕捉的異常:"+ex.Message);
44                 }
45             }
46            
47         }
48 
49     }
創建控制台應用程式進行遠程下載通過獲取WebServices 返回的List<string>URL 集合進行下載

4.定期的進行刪除資料庫備份文件

  1  class Program
  2     {
  3         static void Main(string[] args)
  4         {
  5             //獲取其中的資料庫的備份的路徑
  6             string strDirfile = Properties.Settings.Default.DB_FILE_PATH;
  7             int keepFileCnt = int.Parse(Properties.Settings.Default.KEEP_FILE_CNT);
  8             try
  9             {
 10                 //獲取該目錄下的所有文件,篩選出最新的 現將所有的資料庫的文件進行獲取出來。
 11                 if (string.IsNullOrEmpty(strDirfile) || !Directory.Exists(strDirfile))
 12                 {
 13                     Console.WriteLine("配置的文件的路徑不正確請檢查{0}" + strDirfile);
 14                 }
 15                 if (keepFileCnt <= 0)
 16                 {
 17                     Console.WriteLine("沒有配置刪除的天數");
 18                 }
 19 
 20                 if (strDirfile != null)
 21                 {
 22                     if (Directory.Exists(strDirfile))
 23                     {
 24                         string[] strDirs = Directory.GetDirectories(strDirfile);
 25                         string[] strFiles = Directory.GetFiles(strDirfile);
 26                         DBNameAndTime file = new DBNameAndTime();
 27                         //進行獲取根目錄下麵所有的資料庫的文件的URL
 28                         if (strFiles!=null)
 29                         {
 30                             foreach (string strFile in strFiles)
 31                             {
 32                                 if (strFile != null)
 33                                 {
 34                                     FileInfo fi = new FileInfo(strFile);
 35                                     string[] strArr = fi.Name.Split('.');
 36                                     file.DataName = fi.Name;//文件的名稱也就是備份資料庫的名稱
 37                                     file.FileTime = strArr[4];// 文件中備份的時間
 38                                     file.Url = strFile;
 39                                     DateTime dt1 =fi.LastWriteTime;//文件最後的寫入的時間
 40                                     //然後進行分離其中的資料庫的備份的時間
 41                                     if (strArr.Length > 0)
 42                                     {
 43                                         IFormatProvider provider = new CultureInfo("zh-CN");
 44                                         string tarStr = "yyyyMMddHHmmss";
 45                                         DateTime dt2 = DateTime.ParseExact(file.FileTime.ToString(), tarStr, provider);
 46                                         TimeSpan ts = dt1 - dt2;
 47                                         //進行日期的比較是不是3天前的如果是那麼就進行刪除
 48                                         if (ts.TotalDays >= keepFileCnt)
 49                                         {
 50                                             //進行刪除其中時間為3天的舊文件
 51                                             if (strFile != null)
 52                                             {
 53                                                 //進行根據文件中的創建的時間
 54                                                 File.Delete(strFile);
 55                                                 //將資料庫備份的日誌寫入到記事本中去
 56                                                 using (StreamWriter sw = new StreamWriter(strDirfile + "資料庫備份的刪除日誌.txt", true))
 57                                                 {
 58                                                 

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在上一篇文章中介紹了新手如何安裝Ubuntu14.04的雙系統,本文會說明Ubuntu系統下搜狗輸入法的安裝,並就我遇見的一些bug給出最簡單的解決辦法。 第一部分、搜狗輸入法的安裝 本身搜狗輸入法的安裝是非常簡單的,這裡只是就安裝過程中會出現的問題提供解決方案。 首先,下載linux下64位搜狗輸 ...
  • 01 Linux環境準備 (本文在win10上使用 VMware12 + Ubuntu14.04) 步驟: 步驟: 1、JDK安裝及相關配置 2、Tomcat安裝及相關配置 2、Tomcat安裝及相關配置 3、Mysql安裝及相關配置 3、Mysql安裝及相關配置 詳細步驟: 詳細步驟: 1、JDK ...
  • ASP.NET Core 1.1 Preview 1於2016年10月25日發佈。這個版本包括許多偉大的新功能以及許多錯誤修複和一般的增強。 要將現有項目更新到ASP.NET Core 1.1 Preview 1,您需要執行以下操作: 1. 下載並安裝更新的.NET Core 1.1 Prevew ... ...
  • 使用了第三方的JS庫或框架,在VS中編寫JS代碼,發現真是個悲劇,完全只能手打,智能感知沒了,這不符合VS的一貫做風只要在寫代碼的JS文件加上以下代碼,就可以有智能感知了 說明:path內為使用的第三方JS庫或框架的js文件,如果文件沒有和在編碼的JS在同一目錄下,則要補全路徑 ...
  • 問題 怎樣用在 Web API 中創建 OData 服務。 解決方案 對於我們來說,在 Web API 中使用 OData最簡單的方式就是使用 ASP.NET 模板來創建Odata Controller。在 Controllers 文件夾上滑鼠右鍵->添加->新建項。 顯示一個如圖 12-1 的對話 ...
  • 今天去深圳溜達了一天,剛回來,看到首頁都是微軟大法好,看來離.NET的春天就差3個月了~~回到正題,這篇的教程講解下拉配置,詳情如下:... ...
  • 本文版權歸博客園和作者吳雙共同所有,轉載和爬蟲請註明原文地址:www.cnblogs.com/tdws 首先分享幾個振奮人心的新聞: 1.谷歌已經宣佈加入.NET基金會 2.微軟加入Linux基金會,繼續對Linux示好。換了CEO就是不一樣 3.微軟發佈VS For Mac! 第一步 下載dll ...
  • 從今天開始,正式進入Asp.net Core的開發,估計最近一段時間會經常寫博客了,記錄學些Asp.net Core中遇到的各種坑。 第一個問題:通過core編寫的webapi,預設返回的json會自動格式化為駝峰樣式,並沒有按照具體的類名來返回,如何讓其按照類名返回呢? 在Startup.cs全局 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...