當(dāng)客戶端在 發(fā)出POST請(qǐng)求時(shí)/albums,您希望將請(qǐng)求正文中描述的專輯添加到現(xiàn)有專輯數(shù)據(jù)中。
龍?zhí)毒W(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)公司,龍?zhí)毒W(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為龍?zhí)?000多家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)營(yíng)銷網(wǎng)站建設(shè)要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的龍?zhí)蹲鼍W(wǎng)站的公司定做!
為此,您將編寫以下內(nèi)容:
1、編寫代碼
a.添加代碼以將專輯數(shù)據(jù)添加到專輯列表。
在此代碼中:
1)用于Context.BindJSON 將請(qǐng)求正文綁定到newAlbum。
2) album將從 JSON 初始化的結(jié)構(gòu)附加到albums 切片。
3)向響應(yīng)添加201狀態(tài)代碼,以及表示您添加的專輯的 JSON。
b.更改您的main函數(shù),使其包含該router.POST函數(shù),如下所示。
在此代碼中:
1)將路徑中的POST方法與 /albumspostAlbums函數(shù)相關(guān)聯(lián)。
使用 Gin,您可以將處理程序與 HTTP 方法和路徑組合相關(guān)聯(lián)。這樣,您可以根據(jù)客戶端使用的方法將發(fā)送到單個(gè)路徑的請(qǐng)求單獨(dú)路由。
a.如果服務(wù)器從上一節(jié)開始仍在運(yùn)行,請(qǐng)停止它。
b.從包含 main.go 的目錄中的命令行,運(yùn)行代碼。
c.從不同的命令行窗口,用于curl向正在運(yùn)行的 Web 服務(wù)發(fā)出請(qǐng)求。
該命令應(yīng)顯示添加專輯的標(biāo)題和 JSON。
d.與上一節(jié)一樣,使用curl檢索完整的專輯列表,您可以使用它來(lái)確認(rèn)添加了新專輯。
該命令應(yīng)顯示專輯列表。
當(dāng)客戶端向 發(fā)出請(qǐng)求時(shí)GET /albums/[id],您希望返回 ID 與id路徑參數(shù)匹配的專輯。
為此,您將:
a.在您在上一節(jié)中添加的函數(shù)下方postAlbums,粘貼以下代碼以檢索特定專輯。
此getAlbumByID函數(shù)將提取請(qǐng)求路徑中的 ID,然后找到匹配的專輯。
在此代碼中:
(1)Context.Param用于從 URL 中檢索id路徑參數(shù)。當(dāng)您將此處理程序映射到路徑時(shí),您將在路徑中包含參數(shù)的占位符。
(2)循環(huán)album切片中的結(jié)構(gòu),尋找其ID 字段值與id參數(shù)值匹配的結(jié)構(gòu)。如果找到,則將該album結(jié)構(gòu)序列化為 JSON,并將其作為帶有200 OK HTTP 代碼的響應(yīng)返回。
如上所述,實(shí)際使用中的服務(wù)可能會(huì)使用數(shù)據(jù)庫(kù)查詢來(lái)執(zhí)行此查找。
(3)如果找不到專輯,則返回 HTTP 404錯(cuò)誤。
b.最后,更改您的main,使其包含對(duì)router.GET的新調(diào)用,路徑現(xiàn)在為/albums/:id ,如以下示例所示。
在此代碼中:
(1)將/albums/:id路徑與getAlbumByID功能相關(guān)聯(lián)。在 Gin 中,路徑中項(xiàng)目前面的冒號(hào)表示該項(xiàng)目是路徑參數(shù)。
a.如果服務(wù)器從上一節(jié)開始仍在運(yùn)行,請(qǐng)停止它。
b.在包含 main.go 的目錄中的命令行中,運(yùn)行代碼以啟動(dòng)服務(wù)器。
c.從不同的命令行窗口,用于curl向正在運(yùn)行的 Web 服務(wù)發(fā)出請(qǐng)求。
該命令應(yīng)顯示您使用其 ID 的專輯的 JSON。如果找不到專輯,您將收到帶有錯(cuò)誤消息的 JSON。
恭喜!您剛剛使用 Go 和 Gin 編寫了一個(gè)簡(jiǎn)單的 RESTful Web 服務(wù)。
本節(jié)包含您使用本教程構(gòu)建的應(yīng)用程序的代碼。
本教程介紹了 Go 中模糊測(cè)試的基礎(chǔ)知識(shí)。通過(guò)模糊測(cè)試,隨機(jī)數(shù)據(jù)會(huì)針對(duì)您的測(cè)試運(yùn)行,以嘗試找出漏洞或?qū)е卤罎⒌妮斎搿?梢酝ㄟ^(guò)模糊測(cè)試發(fā)現(xiàn)的一些漏洞示例包括 SQL 注入、緩沖區(qū)溢出、拒絕服務(wù)和跨站點(diǎn)腳本攻擊。
在本教程中,您將為一個(gè)簡(jiǎn)單的函數(shù)編寫一個(gè)模糊測(cè)試,運(yùn)行 go 命令,并調(diào)試和修復(fù)代碼中的問(wèn)題。
首先,為您要編寫的代碼創(chuàng)建一個(gè)文件夾。
1、打開命令提示符并切換到您的主目錄。
在 Linux 或 Mac 上:
在 Windows 上:
2、在命令提示符下,為您的代碼創(chuàng)建一個(gè)名為 fuzz 的目錄。
3、創(chuàng)建一個(gè)模塊來(lái)保存您的代碼。
運(yùn)行g(shù)o mod init命令,為其提供新代碼的模塊路徑。
接下來(lái),您將添加一些簡(jiǎn)單的代碼來(lái)反轉(zhuǎn)字符串,稍后我們將對(duì)其進(jìn)行模糊測(cè)試。
在此步驟中,您將添加一個(gè)函數(shù)來(lái)反轉(zhuǎn)字符串。
a.使用您的文本編輯器,在 fuzz 目錄中創(chuàng)建一個(gè)名為 main.go 的文件。
獨(dú)立程序(與庫(kù)相反)始終位于 package 中main。
此函數(shù)將接受string,使用byte進(jìn)行循環(huán) ,并在最后返回反轉(zhuǎn)的字符串。
此函數(shù)將運(yùn)行一些Reverse操作,然后將輸出打印到命令行。這有助于查看運(yùn)行中的代碼,并可能有助于調(diào)試。
e.該main函數(shù)使用 fmt 包,因此您需要導(dǎo)入它。
第一行代碼應(yīng)如下所示:
從包含 main.go 的目錄中的命令行,運(yùn)行代碼。
可以看到原來(lái)的字符串,反轉(zhuǎn)它的結(jié)果,然后再反轉(zhuǎn)它的結(jié)果,就相當(dāng)于原來(lái)的了。
現(xiàn)在代碼正在運(yùn)行,是時(shí)候測(cè)試它了。
在這一步中,您將為Reverse函數(shù)編寫一個(gè)基本的單元測(cè)試。
a.使用您的文本編輯器,在 fuzz 目錄中創(chuàng)建一個(gè)名為 reverse_test.go 的文件。
b.將以下代碼粘貼到 reverse_test.go 中。
這個(gè)簡(jiǎn)單的測(cè)試將斷言列出的輸入字符串將被正確反轉(zhuǎn)。
使用運(yùn)行單元測(cè)試go test
接下來(lái),您將單元測(cè)試更改為模糊測(cè)試。
單元測(cè)試有局限性,即每個(gè)輸入都必須由開發(fā)人員添加到測(cè)試中。模糊測(cè)試的一個(gè)好處是它可以為您的代碼提供輸入,并且可以識(shí)別您提出的測(cè)試用例沒(méi)有達(dá)到的邊緣用例。
在本節(jié)中,您將單元測(cè)試轉(zhuǎn)換為模糊測(cè)試,這樣您就可以用更少的工作生成更多的輸入!
請(qǐng)注意,您可以將單元測(cè)試、基準(zhǔn)測(cè)試和模糊測(cè)試保存在同一個(gè) *_test.go 文件中,但對(duì)于本示例,您將單元測(cè)試轉(zhuǎn)換為模糊測(cè)試。
在您的文本編輯器中,將 reverse_test.go 中的單元測(cè)試替換為以下模糊測(cè)試。
Fuzzing 也有一些限制。在您的單元測(cè)試中,您可以預(yù)測(cè)Reverse函數(shù)的預(yù)期輸出,并驗(yàn)證實(shí)際輸出是否滿足這些預(yù)期。
例如,在測(cè)試用例Reverse("Hello, world")中,單元測(cè)試將返回指定為"dlrow ,olleH".
模糊測(cè)試時(shí),您無(wú)法預(yù)測(cè)預(yù)期輸出,因?yàn)槟鸁o(wú)法控制輸入。
但是,Reverse您可以在模糊測(cè)試中驗(yàn)證函數(shù)的一些屬性。在這個(gè)模糊測(cè)試中檢查的兩個(gè)屬性是:
(1)將字符串反轉(zhuǎn)兩次保留原始值
(2)反轉(zhuǎn)的字符串將其狀態(tài)保留為有效的 UTF-8。
注意單元測(cè)試和模糊測(cè)試之間的語(yǔ)法差異:
(3)確保新包unicode/utf8已導(dǎo)入。
隨著單元測(cè)試轉(zhuǎn)換為模糊測(cè)試,是時(shí)候再次運(yùn)行測(cè)試了。
a.在不進(jìn)行模糊測(cè)試的情況下運(yùn)行模糊測(cè)試,以確保種子輸入通過(guò)。
如果您在該文件中有其他測(cè)試,您也可以運(yùn)行g(shù)o test -run=FuzzReverse,并且您只想運(yùn)行模糊測(cè)試。
b.運(yùn)行FuzzReverse模糊測(cè)試,查看是否有任何隨機(jī)生成的字符串輸入會(huì)導(dǎo)致失敗。這是使用go test新標(biāo)志-fuzz執(zhí)行的。
模糊測(cè)試時(shí)發(fā)生故障,導(dǎo)致問(wèn)題的輸入被寫入將在下次運(yùn)行的種子語(yǔ)料庫(kù)文件中g(shù)o test,即使沒(méi)有-fuzz標(biāo)志也是如此。要查看導(dǎo)致失敗的輸入,請(qǐng)?jiān)谖谋揪庉嬈髦写蜷_寫入 testdata/fuzz/FuzzReverse 目錄的語(yǔ)料庫(kù)文件。您的種子語(yǔ)料庫(kù)文件可能包含不同的字符串,但格式相同。
語(yǔ)料庫(kù)文件的第一行表示編碼版本。以下每一行代表構(gòu)成語(yǔ)料庫(kù)條目的每種類型的值。由于 fuzz target 只需要 1 個(gè)輸入,因此版本之后只有 1 個(gè)值。
c.運(yùn)行沒(méi)有-fuzz標(biāo)志的go test; 新的失敗種子語(yǔ)料庫(kù)條目將被使用:
由于我們的測(cè)試失敗,是時(shí)候調(diào)試了。
這是引入類型失敗的錯(cuò)誤提示,
import org.wltea ,說(shuō)明你引入了某個(gè)jar 包或者類,但是沒(méi)有找到 ,就報(bào)錯(cuò)了.IK analyzer 中文分詞器 開源的項(xiàng)目 ,有源碼的.把這個(gè)下載好就可以了。