搜尋

搜尋結果

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

最愛在機場拍照打卡?別做這個動作 小心個資全都漏光光!
科技新知
StanSteve・2017-09-04

連續假期即將來臨,許多人應該早早就規劃好要出國旅遊;不過如果你也習慣在出國前拍下登機證、在機場打卡,那可要小心了!因為登機證上的條碼其實含有大量個人資料,PO 上網後恐被有心人士擷取,接下來的旅程甚至可能被駭客直接取消。 (圖/歐新社) 科技媒體 TechInsider 報導,國外資安專家克瑞(Brian Krebs)在個人部落格上指出,許多人喜歡在 Facebook 上 PO 出登機證的照片,與朋友分享出國旅行的開心;然而,這樣做卻很可能讓你的個資通通都落入駭客手中。他解釋,登機證上的二維條碼,除了旅客的姓名以外,還包括出發地、目的地以及會員里程獎勵計畫的編號。 若駭客取得這些資料,就可以竄改旅行計畫、取消航班、更改座位;若你是飛行常客,駭客還可以藉此改變你帳戶的帳號密碼,相當危險。 (圖/aa.com) Brian Krebs 指出,他的一名讀者 Cory 嘗試將朋友貼在 Facebook 上的登機證截圖,並上傳到一個免費條碼解讀站,結果發現該乘客的許多個資,包括姓名、飛行帳號以及個人識別資訊,Cory 還成功取得了該乘客當天搭乘漢莎航空(Lufthansa)航班的電腦代號(record locator),以及該乘客在星空聯盟(Star Alliance)飛行常客計畫中已訂購的航班。 Brian Krebs 也表示,若使用的是紙本登機證,下飛機後千萬不要隨手丟到垃圾桶,建議放到碎紙機內摧毀比較保險;因為透過登機證上的資料再加以搜尋,很可能就找到該名乘客更多的個資,包括住家地址。 你也準備在這個連假出國嗎?記得千萬不要把登機證上傳 Facebook,也不要將紙本登機證隨手亂丟,以免寶貴的個人資料流到有心人士手中。 以上文章及圖片均轉載自網路,所有版權歸原作者所有 原文地址:http3c.ltn.com.tw

異界鎖鏈心得分享
手機‧電玩
MacauYeah・2023-08-18

直接先講結論:好玩,但節奏就差了一點。而這個節奏差,已經算是還不錯的了,起碼比之後發售的獵天使魔女3要好。 一個成功的大膽新嘗試 本作採取單手制雙角色操作,左搖桿為主角行動,右搖桿為召喚前為視角控制、召喚後為雷基恩行動。 經典動作遊戲操作:主角使用ZR作普攻、按ZL召喚雷基恩自動攻擊。在攻擊、極限躲避時,可以在特定時機按ZL與雷基恩發動(多從)同步攻擊。按R與雷基恩作合體技。 以上操作,大家都可以示為單人操作,雷基恩就像武器Buff一樣使用。(像不像DMC系列?) 大膽就玩法:在召喚出雷基恩後,雙角色在交換走位後有一些策略行動:追擊、跳躍、捆綁等組合攻擊。重按ZL可以拉回雷基恩,同時按ZLZR可以跳躍到雷基恩身邊。再跳躍過程中,可順帶對沿途敵人攻擊(一個比DMC4的NERO 魔抓更自主的機制)。這些動作因為要用左右搖桿操作兩角色走位,體驗非常新奇。 筆者動作遊戲的能力一般,沒有研究極限操作,但光是玩它的基本操作,就已經體會到它的樂趣。動作遊戲方面,絕對對得起白金工作室的招牌。筆者亦無法言喻太多,總之玩就對了。 好的說完,就要講講它的毛病。 那個還是不太好的關卡節奏 白金工作室,在很多人眼中會認為是很夠誠意。因為它會加入很多不同的小遊戲小關卡,讓大家可以在高強度的戰鬥中,有時間轉換心情。小關卡或解迷或收集物品,操作也多樣化。 但對筆者來說,這些都很打擾遊玩主線的心情。特別是以最近的獵天使魔女3為例,突然提示你去收集、整個關卡變2D潛行、不適時的動畫過場、特定遲鈍的召喚獸追逐戰,都讓你想好好地玩人型動作遊戲的情緒比打斷。 好在,異界鎖鏈這方面都控制得比較好。小遊戲可以跳過不玩,整關轉變操作模式的情況沒有出現。 雖然如此,但戰鬥過程中總是要加入一些跳躍平台的操作。即便最後打尾王,還是要那樣的調性,一失足又要整段重來。如果你的體驗也於設計跑酷類動作跳躍,我也算了,但一邊格鬥一邊跳,跳完一點都不讓人覺到爽快,那就很礙事。到後來筆者就只能說服自己,這就是白金工作室眼中覺得最有挑戰的東西,如果成功了一定會讓玩家自豪。 綜合評價 總體來講,如果你對各種動作解迷類型都很接受,異界鎖鏈的整體表現一定讓你很滿意。如果你不喜歡在同一個章節中被小遊戲支線打斷、不喜歡突如奇來的平台跳躍,只喜歡專注地挑戰難度格鬥,你就不要對本作有太大的期待。就筆者而言,以5分為滿分,劇情4分,遊戲性3分如果遊戲性只談格鬥操作及流暢度的話一定有5分,但因為節奏問題,整體感覺只能說中規中矩。

Hello Kitty 有機薈低碳農莊 與Hello Kitty 走進大自然
走遍世界
Cheers!・2016-09-09

新界元朗還有全球首個 Hello Kitty 主題農莊,fans 們可以與吉蒂貓一起走進大自然,認識低碳生活和耕種的知識。原名為「有機薈低碳農莊」其實已經開業幾年,為了推動有機耕種及低碳生活,請來了大受歡迎的吉蒂貓坐鎮,打造成 Hello Kitty 主題農莊。 得意的 Kitty 地圖,清楚顯示園內不同區域的位置 農莊面積有 6 萬平方呎,乘坐港鐵在西鐵線錦上路站落車,由 A 出口步行約 5 分鐘便到達,沿途亦有指示牌,非常方便。由入口開始,到處都可以見到 Kitty 的蹤影,最搶眼的莫過一個約 3 呎高、農夫造型的立體 Kitty,非常可愛。園內還有大大小小的 Kitty 木板公仔,除了用作裝飾之外,亦有很多的小 tips,讓遊客認識有機耕種和綠色生活的小知識。 園內還有一個木製的指示牌,很有田園的風味 遊客可以餵飼小山羊 園內分為幾個不同的區域,農地、羊舍、燒烤場、餐廳及商店等,每位入場的遊客都會獲派一張農莊地圖,並在不同的 check point 收集蓋印作為留念。遊客在園內可以學習耕種和環保知識外,亦可近距離與小山羊接觸,或者到有機店購買飼料,餵飼牠們;原來小山羊在農莊亦有重要的任務,就是幫忙吃掉田裡的雜草,並提供有機肥料。 旅遊達人小貼士 香港跨域數據優惠 遊香港想即時將與 Hello Kitty 合照上載到社交網,與親友們分享?只需選用 CTM「跨域數據組合(1 日) 香港」服務,以價惠價 $48(原價 $98)盡情上網,享用當地無限數據用量一天。 註:優惠期至 2016 年 10 月 31 日。如需申請,請於當地撥打#130#。澳門電訊保留最終決定權。 Hello Kitty Go Green 有機薈低碳農莊 地址: 香港元朗錦田四排石村 開放時間: 上午 9 時 30 分至晚上 6 時(逢星期二及三休息) 費用: 假日及公眾假期 HKD $30,平日 HKD $20(大小同價) 查詢: +852 5579 2178

上頭香,有甚麼說法
玄學星相
熊神進・2017-01-27

全球華人都很重視春節的到來, 大部份地區, 如美國、新加坡、臺灣、香港、澳門以及國內很多城市的民眾都會在今晚上頭香(吉時是年初一0時後至3時又或5時至9時),上頭香有三個意義: 迎新年(其實立春才是新的一年) 感謝佛菩薩的護佑 許願 上頭香不限於今晚,佛菩薩大慈大悲, 不會因為你來不到寺廟上頭香就不護佑你,假如你住的地方離寺廟很遠,你可以在家的西北方(喜神)西南方(貴神)上香拜拜,香的煙氣會把你的許願直送上天。 筆者並不是叫大家急於上頭香,而是想大家今晚靜下來, 抽出30分鐘時間去懺悔,去三思,去感恩,只有通過靜思冥想, 才能找出康莊大道。現在讓我們一起想想,在過去的一年hellip;hellip;hellip;hellip;hellip;hellip;hellip;hellip;. 我們的親人、朋友(又或不認識的人,只是從新聞中聽到)有多少人已經離開了我們? 我們分手後,有多少次埋怨對方? 甚至想報復又或自殺? 我們有沒有做過人流,有沒有為嬰靈超度? 我們的上司老闆領導老師是如何教導我們? 筆者年老,財薄力弱, 沒有甚麼都可答謝讀者,每年的今夜, 我只能為讀者、信士、客戶、親朋好友祈福, 並把大家的心願、懺悔、感恩,上報天界,下添油香,請大家就把心願寫下來(截止時間是今天23時0分), 請給我一個機會, 為你們念經, 為你們祈福, 化解你們的災困, 感恩, 並願大家身體健康, 家庭幸福。 

金光飛航為澳門居民推出「買一送一」船票優惠
激安優惠
LifeMag Editor・2016-05-31

澳門金光飛航為休閒及商務旅客推出令人興奮的全新優惠,乘客可以最優惠船票價格盡享舒適便捷的旅程。全新優惠包括澳門居民「買一送一」船票優惠,推廣期由2016年6月1至7月15日。此外,由即日起至2016年12月31日,金光飛航為在生日月份乘搭的乘客提供來回船票的折扣優惠。 澳門居民「買一送一」船票優惠推廣 持有澳門居民身份證的乘客在2016年6月1至7月15日期間,以正價購買金光飛航從澳門出發至香港的市區航線及機場航線標準艙或頭等艙成人的船票,即可獲贈同等級艙位回程免費船票一張。首程船票出發地必須是澳門氹仔客運碼頭或澳門外港客運碼頭。旅客需於購買首程船票時確定回程船票的航班時間。此特別優惠每人每天僅限購買一次。所有行程必須於2016年7月15日或之前完成。 生日月份優惠 由即日起至2016年12月31日,所有金光飛航乘客可於其生日月份享有來回套票優惠。旅客只須出示能確實其出生日期的有效身份證明文件,即可以每套港幣澳門幣238元購買標準艙來回套票,或每套港幣澳門幣438元的頭等艙來回套票優惠,歡慶這個特別的生日月份。 此外,金光飛航頭等艙乘客亦可在每日中午12時至下午2時盡享船上餐牌內增添的美食,包括公司三文治、香腸包、雞肉三文治或煙燻火腿雜菜配蛋黃醬帕尼尼三文治,並將每週更換餐單。 以金光飛航來回暢遊澳門香港,享盡無懈可擊的體驗。金光飛航每天早上6時30分至凌晨3時提供服務;由早上6時30分至晚上11時30分期間之航班為每30分鐘一班。 更多有關金光飛航的優惠及詳情,查詢班次以及網上訂購船票請瀏覽 httphk.cotaiwaterjet.comferrypromotionhk.html 或訂閱金光飛航官方Facebook httpswww.facebook.comcotaijetferry

【新卡情報】大豐銀行銀聯大灣區卡
生活在我城
澳門優惠・2018-12-16

大豐銀行推出銀聯大灣區卡,有咩優惠?即刻睇睇! 迎新優惠(二選一) MOP300免找數簽賬額; 高達MOP40,000「Easy Cash免息現金分期」 年費優惠 主卡及附屬卡可豁免首3年年費 澳門停車場20倍積分優惠 憑於本澳停車場繳付泊車費,可享20倍積分獎賞! 銀聯閃付5%簽賬回贈 憑使用QuickPass 手機支付,均可賺取5%現金回贈! 海外簽賬0%手續費 「活出息」存款戶口 憑即可開立大豐「活出息」存款戶口,享有較一般活期更高的存款利率! 「環亞機場貴賓候機室」服務 憑於2019年度簽賬滿指定金額可享2020年環亞機場貴賓候機室免費次數 豁免兌換飛行里程手續費 憑兌換4大航空公司(亞洲萬里通、中國國航、中國南航及中國東航)飛行里數,可獲豁免兌換手續費! 私人禮賓服務 憑可享私人禮賓服務,詳情可瀏覽 httpswww.unionpaypremium.com.hkzhpersonalconciergeprivileges 澳門OTO簽賬優惠優惠期至20190228 簽賬滿MOP3,000或以上,可獲贈OTO Hand Spa價值MOP1,498禮品 澳門樂團201819音樂季八折購票優惠優惠期至20190228 InWay背包全線商品七折優惠優惠期至20190522 詳情: httpwww.taifungbank.comzh_TWpage1105 所有優惠及條款以官方網站為公布為準。 更多澳門優惠情報、有獎活動及有獎遊戲,可瀏覽 httpslifemag.cyberctm.comzh_TWbloggerMacauJetso。