差異處

這裏顯示兩個版本的差異處。

連向這個比對檢視

Both sides previous revision 前次修改
下次修改
前次修改
java:web:jercey:produce_json_result [2014/10/02 17:53]
tony [Reference]
java:web:jercey:produce_json_result [2023/06/25 09:48] (目前版本)
行 1: 行 1:
 +{{tag>​jercey REST}}
 ====== Produce Json Result ====== ====== Produce Json Result ======
-網路上其實可以找到不少的教學,但實際操作起來應該還是會遇到設定與寫法上的問題。我就寫一下大概是怎麼完成的。+網路上其實可以找到不少的教學,但實際操作起來應該還是會遇到設定與寫法上的問題。我就寫一下大概是怎麼完成的,我環境使用JDK7與Tomcat7,搭配Servlet 3.0,功能僅透過annotation就可完成
 ===== Dependency ===== ===== Dependency =====
 ==== Server ==== ==== Server ====
 除了Jercey本身自帶的那包jar檔外,server-side還需要jersey-media-json-jackson與jackson的jar。jersey-media-json-jackson可至Reference 2中找尋,jackson可至Reference 3中找尋。 除了Jercey本身自帶的那包jar檔外,server-side還需要jersey-media-json-jackson與jackson的jar。jersey-media-json-jackson可至Reference 2中找尋,jackson可至Reference 3中找尋。
 +==== Client ====
 +最簡單就是把所有server用到的jercey相關jar檔都丟過去。而我用到的jar檔有以下幾個:​ hk2-api*.jar、hk2-locator*.jar、hk2-utils*.jar、jackson-all*.jar、javax.annotation-api*.jar、javax.inject*.jar、javax.ws.rs-api*.jar、jercey-client.jar、jercey-common.jar、jercey-guava*.jar、jercey-media-json-jackson*.jar。
 +===== Implementation =====
 +==== Server ====
 +在Application中針對要提供此功能的package註冊JacksonFeature類別。
 +<code java>
 +@ApplicationPath("​auth"​)
 +public class AuthApplication extends ResourceConfig{
 +    public AuthApplication(){
 +        packages("​org.tonylin.auth"​).register(JacksonFeature.class);​
 +    }
 +}
 +</​code>​
 +Server預期接收form的post資料,內容為key,並產生Json回應給Client。
 +<code java>
 +@Path("/​tbattle"​)
 +public class TBattleAuthRS {
 +    @Context ServletContext context;
 +
 +    @POST
 +    @Produces(MediaType.APPLICATION_JSON)
 +    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
 +    public AuthResult auth(@FormParam("​key"​) String key) {
 +    AuthResult result = new AuthResult();​
 +    result.setAuthCode(key);​
 +    result.setResult(AuthResult.encodeResult(String.valueOf(containKey(key))));​
 +        return result;
 +    }   
 +    ​
 +    // skip some functions code
 +}
 +</​code>​
 +==== Common Code ====
 +要由物件轉成Json或由Json轉成物件的類別,必須Override toString,實做如底下範例程式碼。
 +<code java>
 +public class AuthResult {
 +
 + public String toString() {
 + StringBuffer sb = new StringBuffer();​
 + sb.append("​ AuthCode: "​).append(this.mAuthCode);​
 + sb.append("​ Result: "​).append(this.mResult);​
 + return sb.toString();​
 + }
 +
 + // skip some functions code
 +}
 +</​code>​
 +==== Client ====
 +Client要使用Jackson的功能,必須如Server-side做註冊的動作,再來就是直接對Server發送請求與接收回應。在回應的地方我們可以直接指定對應物件,讓Jackson幫我們做轉換,如果是一般字串則用String.class即可。
 +<code java>
 + private void auth(String aTarget, String aAuthCode) throws ​ AuthException{
 + try {
 + JerseyClient client = JerseyClientBuilder.createClient().register(
 + JacksonFeature.class);​
 +
 + JerseyWebTarget target = client.target(aTarget);​
  
 + Form form = new Form();
 + form.param("​key",​ aAuthCode);
  
 + AuthResult result = target.request(MediaType.APPLICATION_JSON_TYPE)
 + .post(Entity.entity(form,​
 + MediaType.APPLICATION_FORM_URLENCODED_TYPE),​
 + AuthResult.class);​
 +
 + // skip implementation
 +
 + } catch( AuthException e ){
 + throw e;
 + } catch( Exception e ){
 + throw new AuthException("​Auth failed: "​+e.getMessage(),​ e);
 + }
 + }
 +</​code>​
 +===== Summary =====
 +整體實做看起來相當容易,但我遇到最大的問題,是網路範例或Jercey使用手冊與實際不大相同的! 這是經過許多爬文與測試,才完成我所要的功能。此外,Json的輸出格式也許並不算完善。一個完善且優良的Rest API結果,還必須包含分頁內容、錯誤訊息處理,甚至Hyper-Media的內容等,這些是我還沒去研究該如何實做的! 目前僅知道可去Override Jackson的ObjectMapper去達到自己想要的格式化輸出。之後有時間會再繼續研究下去,又或者跳槽改去玩Spring的RS。
 +\\
 +\\
 +友藏內心獨白:​ 把新知用在有的沒的東西上,也是一種學習動力!
 ===== Reference ===== ===== Reference =====
   * [[https://​jersey.java.net/​documentation/​latest/​user-guide.html#​json|Jercey UserGuide - Json]]   * [[https://​jersey.java.net/​documentation/​latest/​user-guide.html#​json|Jercey UserGuide - Json]]
   * [[http://​mvnrepository.com/​artifact/​org.glassfish.jersey.media|jersey-media-json-jackson]]   * [[http://​mvnrepository.com/​artifact/​org.glassfish.jersey.media|jersey-media-json-jackson]]
   * [[http://​wiki.fasterxml.com/​JacksonDownload|Jackson Download]]   * [[http://​wiki.fasterxml.com/​JacksonDownload|Jackson Download]]
 +  * [[http://​www.sitepoint.com/​best-practices-rest-api-scratch-introduction/​|Best Practice Rest API Scratch Introduction]]
 +=====    =====
 +----
 +\\
 +~~DISQUS~~