搜尋

搜尋結果

Spring Boot 04 - 進入http json api 世代
科技新知
MacauYeah・2024-05-23

本節,我們將會建立一個http服務,提供json api讓程式訪問。 下戴模版 我們跟上節一樣,使用Spring Initializr Maven 下載模版,但細節筆者就不再講啦。Dependency主要選擇 Spring Web Spring Boot DevTools 下載後,可以直接運行測試,可以用指令 mvn test 或經IDE運行。Spring會至少測試下能不能成功取用預設的8080端口。 Controller 我們若要實作 http json api,需要在 spring 中加入一個類,附註為 @RestController ,那方便起見,類名我們也命名為 XXXController 吧。作為示範,我們弄一個 HomeController.java ,裏面有最常見的 http GET, POST功能。 srcmainjavaiogithubmacauyeahspringboottutorialspringbootwebapibasiccontrollerHomeController.java import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; ... other import @RestController @RequestMappingquot;apiquot; public class HomeController @GetMappingquot;someRecorduuidquot; public Map readSomeRecord@PathVariable String uuid return Map.ofquot;retquot;, quot;your uuidquot; uuid; @PostMappingquot;someRecordquot; public Map createSomeRecord@RequestBody Map requestBody HashMap ret = new HashMaprequestBody; ret.putquot;retquot;, quot;got your requestquot;; return ret; HomeController裏,完整的URL 其實為 GET httplocalhost8080apisomeRecorduuid POST httplocalhost8080apisomeRecord URL中的api之後的路徑,都是定義在 HomeController 中,而前半的8080及context path,是使用預設值。在正式環境下,可能隨時會被重新定義。但我們做本地測試,只需要驗證預設值就可以了。 我們真的運行起程式mvn clean compile springbootrun,再使用最簡測試工具進行測試。Windows的朋友,可以選擇Postman作為測試,它有圖形介面。而linux的朋友,請用curl,預設安裝都會有。下列為方便表示測試參數,筆者選用curl。 測試GET,其中1234會自動對應到spring裏的uuid。 curl httplocalhost8080apisomeRecord1234 # return quot;retquot;quot;your uuid1234quot; 測試 POST,其中的 d 參數,會對應 spring裏的 @RequestBody, H 參數則是設定 http header 的意思,我們就使用約定俗成的 json 作為 header 。 curl X POST httplocalhost8080apisomeRecord H quot;ContentType applicationjsonquot; d 'quot;requstquot;quot;did you get itquot;' # return quot;requstquot;quot;did you get itquot;,quot;retquot;quot;got your requestquot; 上面的兩個操作,都回傳了我們輸入的資訊,這代表了我們成功用spring架起了http json api,而且正常讀入資訊。 Test Case 雖然我們可以正常地架起 api,但每次開發都要 postman curl這種工具額外試一次,其實也有一些成本。而且 api 數量變大,或經多次修改後,就重複人手執行,就變得相當討厭。 面對這個問題,筆者會建議寫測試用例,即是Test Case,而且用Spring內置的@SpringBootTest來寫。 產生一個空的Test類,vscode中,最簡單可以Source Action =gt; Generate Test,然後加入這次要測試的參數。 srctestjavaiogithubmacauyeahspringboottutorialspringbootwebapibasiccontrollerHomeControllerTest.java import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.RequestBuilder; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.result.MockMvcResultHandlers; import org.springframework.test.web.servlet.result.MockMvcResultMatchers; @SpringBootTest @AutoConfigureMockMvc public class HomeControllerTest @Autowired private MockMvc mockMvc; @Test void testGetSomeRecord throws Exception RequestBuilder requestBuilder = MockMvcRequestBuilders.getquot;apisomeRecord1234quot; .contentTypeMediaType.APPLICATION_JSON; this.mockMvc.performrequestBuilder .andExpectMockMvcResultMatchers.jsonPathquot;$.retquot;.valuequot;your uuid1234quot; .andDoMockMvcResultHandlers.print; @Test void testPostSomeRecord throws Exception String request = quot;quot;quot; quot;requstquot;quot;did you get itquot; quot;quot;quot;; RequestBuilder requestBuilder = MockMvcRequestBuilders.postquot;apisomeRecordquot; .contentTypeMediaType.APPLICATION_JSON .contentrequest; this.mockMvc.performrequestBuilder .andExpectMockMvcResultMatchers.jsonPathquot;$.requstquot;.valuequot;did you get itquot; .andExpectMockMvcResultMatchers.jsonPathquot;$.retquot;.valuequot;got your requestquot; .andDoMockMvcResultHandlers.print; 最後就是執行 mvn test 或經IDE運行,應該都會得到所有測試都通過的結果。 mvn test # other test result ... INFO Tests run 2, Failures 0, Errors 0, Skipped 0, Time elapsed 0.368 s in io.github.macauyeah.springboot.tutorial.springbootwebapibasic.controller.HomeControllerTest # other test result ... 上面的程式碼很多,我們逐一來。 @SpringBootTest 寫在類的外面,代表執行這個測試類時,需要運行起整個Spring程序,當然也包括http的部份。 @AutoConfigureMockMvc 寫在類的外面,代表執行這個測試類時,可以模擬一些發向自己的 http 請求。 @Autowired private MockMvc mockMvc 寫在類的裏面,因為之前有定義了可以模擬 http 的請求,Spring在運行時為大家提供了那個所謂的模擬http client的實例。 MockMvcRequestBuilders,則是建造要測試的URL及Header參數。 MockMvcResultMatchers,則是檢查回傳的結果是否如遇期的一樣。 為何這個http client叫模擬 Mock 因為在測試用例中,可能連Controller 內部依賴組件也需要進一步模擬,這樣才能把測試目標集中在Controller裏,這也是單元測試的原意。只是本次的例子看不出模擬與否的差別。 MockMvcResultMatchers.jsonPath,這是用來檢測json的結構是否跟預期一樣。有些網路上的其他例子會簡寫成 jsonPath ,但因為vscode IDE的自動import功能比較差,筆者還是保留傳統的寫法。 如果大家覺得@SpringBootTest很難,想折衷地把其他測試方法,那麼把 postman curl好好管理起來,每次修改完程式,都完整地執行一次 postman curl ,也可以達到測試的效果。只不過大家還是要好好學會整合 postman curl,知道如何檢測json結構,什麼時候有錯,什麼時候叫測試通過,所以也要花一樣功夫來實現。 最後,大家千萬不要因為測試難寫而逃課,因為寫測試絕對地可以減輕日後重執行的工作量。除非你的程式碼即用即棄,否則都建議寫測試。測試跟寫文檔不一樣,有了測試也不能沒有文檔。好消息的是,文檔現在越來越多自動生成的工具,我們日後再找機會介紹。 Source Code spring boot web api basic

澳門首家手工「貝果」專賣店,人均$18起備受追捧!冇預訂分分鐘食唔到!!
澳城餐飲
食在澳門iFood・2021-03-27

烘焙的魅力在於 用愛和溫暖製造 平凡生活中的小確幸 蓬鬆、甜蜜、微苦、鬆軟 基調永遠係慰藉人心的甜 今日份層層遞進的幸福 來自有溫度的貝果專賣店 「iBAGEL貝果屋」 ▼ 遇見一間素未謀面的小店,被鑲嵌喺墻上的燈盞閃著微黃的光,簡約至極卻又令人倍感溫馨,讓人忍不住想要一探究竟。 店內播放著首首柔情的歌曲,工作台前來回的身影,偶爾飄來烘焙時沁人的香氣,仲有廚具輕微的碰撞聲,一切都這麼賞心悅目。 iBAGELmdash;澳門首家貝果專賣店,不同於機器化的批量生產,店內貝果每天都係純手工現做,最好就需要提前預訂,真正的美味都值得耐心等待。 純人手的道道工序,不僅賦予貝果新的生命更傳遞手心的溫度,讓細膩的口感食到嘴裡散發出令人回味的幸福感。 iBAGEL口味琳瑯滿目,芝士、紫薯忌廉、朱古力、伯爵茶等等,讓人難以忘懷的味道和口感,你的味蕾會由誰來喚醒? 全麥貝果 營養到位好食唔肥,全麥貝果首當其衝,有著高營養價值的全麥貝果係優質健康佳品。 一啖咬落去喺嘴裡散發著穀物的自然香氣,自帶獨特的纖維感,香甜的味道忽遠忽近。 芝麻貝果 黑白芝麻星星點點灑喺貝果上,返璞歸真,刪繁就簡,內裡柔軟蓬鬆,穀物的自然香甜充斥口腔。 被稱為「八穀之冠」的芝麻,係最利於健康的天然食品,外皮韌性十足,微微濕潤的內芯越嚼越香,味蕾與身心都被悉心呵護周全。 芝士貝果 芝士喺甜品界係永恆的經典,表面微微皺起的外皮,不禁讓人好奇裡面到底,藏著怎樣的寶藏味道。 馥郁的芝士香裡混著淡淡的小麥香氣,舌尖撫過鹹甜交織的芝士,喺味蕾悄悄散開,引來讓人感知幸福的苯多安係來自貝果的關懷。 紫薯忌廉芝士貝果 「餡料」係貝果的靈魂所在,而貝果屋創造的內餡極其豐富精彩,紫薯忌廉芝士貝果將內餡元素綜合得恰到好處。 自帶獨特高級的清香,一出爐便飄香四溢,入口餡料融化喺唇齒間,紫薯芝士忌廉每一種口感一一捕捉,妙不可言。 特濃朱古力貝果 貝果屋將巧克力融入貝果,這一極具誘惑的結合做出ldquo;表裡不一rdquo;的貝果,睇落平平無奇內裡大有文章。 大概所有女生都無法拒絕朱古力的誘惑吧,濕潤蓬鬆的貝果夾著香醇絲滑的朱古力,微苦卻散發濃郁可可味的朱古力,正如阿甘正傳所說:ldquo;人生就像一盒朱古力,你永遠不知道下一塊是什麼滋味rdquo;。 朱古力麻糬貝果 朱古力與麻糬的搭配直擊年輕人的心,圓圓小小的身體裡內藏帶給人快樂的巨大能量,輕微加熱30秒口感會更加誘人 綿密細膩的朱古力包裹著Q彈柔韌的麻糬,食之前用微波爐加熱,外界的熱度激發朱古力的馥郁濃滑,甜和苦之間、濃與淡之間得到了想要的滿足。 意式風情貝果 意式風情貝果喺充斥著甜香的貝果屋當中係一股清流,鹹口麵包愛好者的不二之選,內餡採用蕃茄乾、辣肉腸與芝士成為固中精彩,用料絲毫不馬虎。 漂亮的橫切面清晰地看見貝果裡鬆弛有度,蕃茄乾、辣肉腸綿軟入味,芝士濃郁鮮香,每一啖都口味純正。 伯爵茶貝果 高級感的焦褐色係伯爵茶的代表色,中間輕輕撕扯開,用手指感受到貝果有著恰到好處的濕潤度和柔韌度。 細碎的茶葉藏在其中,散發出柔和的茶香,入口能感受到茶葉細小的顆粒感與貝果相融,細心的品味能夠感知到,其中淡雅清香的內在。 iBAGEL 貝果屋 地址 澳門冼星海大馬路277號恆基花園N鋪 營業時間 10301830(週日休息) 人均 18mopmdash;50mop 溫馨提示 因每日出品有限 需提前在Instagram或wechat進行預訂 圖文 肥肥 美工 陳真香 攝影 他說他叫修杰楷

【澳門求職攻略2020】踏出脫離失業第二步:小心提防求職陷阱
生活在我城
Cheers!・2020-04-17

在上一篇【澳門求職攻略2020】踏出脫離失業第一步:尋找適合自己的工作 中,小編為大家介紹了在澳門尋找工作的多種途徑,但在澳門尋找工作期間,求職者往往會遇到一些求職陷阱,稍一不慎便會招致損失,所以求職者必須要小心提防,保持高度警覺性。如有需要,應立刻尋求家人或澳門司警協助。今日一齊來認識一些常見求職陷阱的主要特徵。 要求繳交費用 最常見的求職陷阱就是要求求職者繳交培訓費用、行政費用或工作簽證費用等令人一頭霧水的費用。故勿論要繳交的金額是多是少,求職者一定要拒絕繳交,因為這很明顯就是「騙財」的先兆。必須要謹記,求職者是去工作賺取薪酬,而不是去繳交費用來換取工作,付出金錢才能夠上班工作是不合乎常理的。 工作輕鬆,無須學歷或經驗,薪酬豐厚 這款求職陷阱是利用求職者想「揾快錢」的心態。求職者要明白,薪酬永遠和工作經驗、職業資格或學歷掛勾。工作薪酬愈高,意味需要求職者具備相當高程度的學歷、豐富的工作經驗或特別的專業資格。當求職者遇到一些低學歷,甚至是無須學歷,或無須工作經驗,但薪酬十分可觀,或強調工作輕鬆的招聘廣告,這時候求職者理應要小心提防。 提供指定資料就獲得聘用 如果發現求職廣告上,聲稱只需要求職者提供銀行戶口號碼、證件號碼或信用卡資料,就可以獲得豐厚酬勞或會直接聘用的話,這分明就是一個求職陷阱。另外,求職者也要小心僱用公司會假借需要求職者到外地工作為名,來騙取求職者的護照資料。除此之外,求職者在填寫履歷表的時候,要小心不要填寫與工作無關的資料,例如:銀行戶口號碼或信用卡等重要資料。 公司背景或工作內容模糊 有些求職廣告,只有電話號碼及聯絡人的姓氏,沒有提供公司名稱或工作內容,又或者是一間不存在的公司,以及工作內容不清晰,可能只提及是在某地區上班等等,這些都有可能是求職陷阱。求職者必須先從求職廣告上,充分了解公司背景及工作內容,再三考慮才決定是否要遞交履歷表。 在不適合的地方或時間進行面試 求職者應儘可能避免在夜晚至深夜的時候,在狹窄的後巷,或在四處無人等危機四伏的地方進行面試。不但對求職者的人身安全構成危險,而且就算想向求職者提供援助也相當困難,所以在不適合的地方或時間進行的面試,求職者應可免則免。 倘若求職者仍然想在深夜或有危險的地方,到僱用公司進行面試的話,求職者應事先向家人提供面試的時間和地點,最好攜同家長或可靠的朋友一同前往面試地方,有個照應,以策安全。 遊說購買公司產品 與最常見求職陷阱之一的「要求求職者繳交費用」有些相似,都是想騙取求職者的金錢。當進行面試的時候,如果求職者被面試職員不停地遊說購買其公司的產品或服務,應立刻提高警覺性,並且以堅定的態度及以婉轉的方式來拒絕。就算求職者真的是需要購買該產品或服務,也不應該在面試的時候購買。 要求提供與工作無關的照片或資料 求職者在履歷表上填寫個人資料的時候,或在進行面試期間,只須要提供與工作有關的照片和資料,例如:求職者的正面大頭相近照、相關的工作經驗、學歷、已擁有的專業資格、曾參與過的活動等,切勿隨便提供與工作無關的照片和私人資料。假如求職者被要求提供與工作無關的照片或資料,例如:求職者的性感照片、家人的名字、朋友的年齡、父母的物業資料等,應立刻拒絕提供。 合約有含糊不清的條款 簽署合約是一個非常關鍵的時刻。從招聘廣告到面試,求職者可能都無發現有甚麼可疑之處。然後當求職者以為從此可以脫離失業,在最鬆懈的情況下,沒有仔細檢查並簽署合約的時候,往往就會帶來惡夢般的損失。 在合約上簽名之前,求職者為保障自己的利益,一定要再三檢查並核對合約上所有資料,是否清楚明白及準確無誤,包括求職者的姓名、需要履行的職責、甚麼情況下會被撒職,以及最重要的合約條款等任何在合約上出現的文字。假如求職者在合約上,發現有些奇怪的地方,例如:某一行的合約條款的字型異常細小、使用了求職者不能理解的其他國家文字、有塗改過的痕跡、使用了深奧或含糊不清的字句等,都一定要對方職員解釋清楚,或拒絶簽署該份僱用合約。求職者只要一日未在合約上簽署,合約都不會生效,也不具有法律效力。 可疑的工作 有些可疑的招聘廣告,都會含有一些令人費解的工作條件。例如:需要相貌端好的清潔工人、聘請英俊的搬運工人、誠徵年輕貌美的陪月員等,這些都是求職陷阱的特徵。 其次,在面試期間,求職者應向對方再三確認工作的內容。假如對方支吾以對,或拒絕透露工作內容,這時候求職者應提高警惕。 最後,當求職者被僱用後,發覺工作有可疑,例如:運送的包裹可能是違禁品,應立刻停止手上的違法工作,並聯絡澳門司法警察局,切勿心存僥倖,以身試法。 求職陷阱時時刻刻都會在求職者尋找工作的時候出現。當求職者在查閱招聘廣告,或進行面試時,一定要持有懷疑的態度,仔細留意招聘廣告和合約內容的虛實,思考有無甚麼不清楚、不明白或不尋常的地方,凡事都要三思而後行。如發現自己可能遇到求職陷阱,應立刻向家人、朋友、社工或澳門司警尋求協助。 如果求職者已經找到合適自己,並且是可靠的職位空缺,便可以開始編寫吸引力高的個人履歷表,並遞交至聘用公司。小編將會在下一篇為大家介紹,如何編寫一份具吸引力的履歷表。 延伸閱讀: 【澳門求職攻略2020】踏出脫離失業第三步:撰寫吸引眼球的履歷表 以上部分資料參考來源:澳門司法警察局 作者:IronMan