URI names are case-sensitive when using Jersey

標題其實不很正確,嚴格來說是URI names are case-sensitive
不過我第一次寫RESTful Service是使用Miscrosoft的ASP .NET Web API,可能ASP .NET Web API內部有什麼機制處理過,case-sensitive這件事並沒有作用。

這陣子使用Java陣營的Jersey實作RESTful Service,發現無論是URL或request body都有分大小寫,例如

GET
http://localhost:8080/WebDemo1/rest/Group/1  成功, StatusCode:200
http://localhost:8080/WebDemo1/rest/group/1   失敗, StatusCode:404

POST
http://localhost:8080/WebDemo1/rest/Group/   成功, StatusCode:204
request body {"groupName":"MIS","parentID":1,"enable":"1","createCompany":"AAA","createName":"Karen"}
http://localhost:8080/WebDemo1/rest/Group/   失敗, StatusCode:500 找不到GroupName欄位
request body {"GroupName":"MIS","parentID":1,"enable":"1","createCompany":"AAA","createName":"Karen"}

本以為是Java區分大小寫的特性,想說找找有無IngoreCase之類的Func.可用,後來才發現錯怪Java了,其實是Jersey乖乖遵守W3C的標準(請參考6.2.2.1與 6.2.3)
所以透過Jersey開發RESTful Service要小心捏,但如果實在不想使用者因大小寫被擋住,可以考慮這篇文章@FormParam case sensitivity in Java Jersey的解法,或是棄用Jersey跳槽使用JBOSS開發的RESTEasy

參考文章
Case-insensitive URLs with JAX-RS

沒有留言: