導航:首頁 > 編程語言 > jersey解析json

jersey解析json

發布時間:2023-08-07 20:27:51

❶ 如何結合REST和jsON構建API

轉載
構建web可訪問應用編程介面很簡單,但使之良好工作,而且不間斷卻不簡單,Les Hazlewood在2013年javaOne大會上如此說,他是Stormpath的首席技術官。Hazlewood在大會上展示了通過JAX-RS和Jersey構建美好的REST+JSON API的最佳實踐。
「表面看來,良好的REST API很簡單,即使後端很復雜,」 Hazlewood在一次采訪說到。一個API關注一系列的東西,以及如何表現個人的東西。減少API集合,搜索所有書籍和出版刊物,你會發現一個簡潔的解決方案,它很直觀,且不是太復雜。
在本文中,Hazlewood深入打探討了API最佳實踐、REST API和JSON的優缺點等等。
使用REST API時,什麼是開發人員需要探索的?
Les Hazlewood:REST作為架構式構建存在於HTTP的最頂層。你交換數據的方式、你創建、讀取、更新和刪除數據的語義都建立在HTTP規范之內。REST是用於編纂當交換跨分離機器創建讀取-刪除時的工作環境如何。
這就是REST,編纂這些跨分離機器的行為發生的方式。因為它依賴於HTTP,我可能有一台Linux機器,它可以與Windows機器時行對話,也可以與Mac機對話。它並不是平台或廠商特定的。因為HTTP無處不在,所以REST就無處不在。所有語言(Python、PHP、Java和C#)都可以與REST一起工作。
REST簡化了所有方面。所有人都以為他們了解了HTTP。這正是你的瀏覽器所講的東西。他們知道HTTP協議、知道GIT、知道POST,因為他們多年以來一直在填寫web表單。所以因為REST只使用HTTP,開發人員就認為它很簡單,但是現在REST服務越來越多,而不是XML,它融匯的SOAP。
使用REST的難點在哪?
Hazlewood::這正是我要做的演講原因。REST是架構樣式,但是使用它的方法論還沒有正式的標准和規范。用樣式來解釋一下。我認為它的運行方式可能會與你以為稍微有點不同。因為它不是一個機器可以復制的規范,這里摻入了人為的因素。把東西變得簡單易用的漏洞往往都不簡單。REST和JOSN很簡單。HTTP很簡單。但要確保使用兩者解決問題時,要直觀,而不是隨處都可編碼化。
你推薦JSON和REST一起使用的其它原因還有什麼?
Hazlewood:REST和JSON提供了與人友好的數據表述方法;數據不再像XML那樣擁擠;你的肉眼就可以很容易看到。這一直都是廣泛採用JSON的原因。
JSON是語法規范。它只是定義了基本的字元串、數字、空值、非空值。它允許你以一種簡單的模式表述復雜的事情,而且以最小的元數據量。它如此的篇章,可以用於許多不同的環境中。機器很容易對其進行解析。人們也很容易閱讀。
JavaScript是世界上一個佔有重要位置的編程語言。即使主要的應用是由Java、Python或C#構建的,比重也很高,如果你有一個網頁,或一個可視的用戶界面,那麼就會涉及到一些JavaScript。JSON與JavaScript兼容。所有具備JavaScript編程經驗的人都會發現他們很容易就會了解JSON。如果你已經使用了JavaScript,那就能很輕松地與API集成。如果API返回給JSON,而且你已經編寫的JavaScript,那麼你的編程語言就已經知道如何與返回給伺服器的數據進行交互。JSON使用JavaScript進行數據交換,而不只是編寫軟體,這在當前已經很流行了,
什麼時候使用JSON正確,什麼時候錯誤?
Hazlewood:顯然,XML在結構化表述數據上更好。XML文檔中包含更多的信息,類型在XML文檔中表述會更有效。XML非常適合數據交換,但易用性方面卻使用開發者猶豫了。JSON用肉眼就可以檢查。XML在設計上更復雜。JSON是非常簡單的語法。談到語言設計,JSON只構建了一小部分的核心元素,而且一切都源於這一小部分元素。因為它的簡單性,它很容易操作,也很容易理解。與XML相比,JSON並不是很適合機器消化信息。從這點來看,XML就會做的更好。

❷ 如何在java REST API中用GZip和Jersey壓縮相應

有許多情景當你的REST api提供的相應是非常長的,並且我們都知道傳遞速度和貸款在移動設備/網路上是多重要。當開發支持REST apis的移動app的時候,我認為首要的性能最優化的點就是需要解決。猜猜是什麼?因為響應式文本,因此我們能壓縮這些文本。而且隨著當前的只能手機和平板的能力,在客戶端解壓文本應該不是個大問題...因此在這篇文章中,如果你使用java的Jersey構建它,我將介紹你怎麼能有選擇性的壓縮REST API響應,這個Jersey事JAX-RS的映射實現(還有更多)...

1.Jersey過濾器和攔截器

啊,感謝Jersey的強大的過濾器和攔截器特性,這個實現是相當容易的。然後過濾器是主要打算來維護像HTTP headers,URIs和/或HTTP methods的request和response的參數,攔截器是維護實體,通過維護實體的輸入/輸出流。

但是對於壓縮將使用一個GZip WriterInterceptor,一個寫攔截器被用於這種情況,在那個類里,實體被寫到"wire",當在這種情況中時,它在伺服器這邊,這就意味著輸出一個響應實體。

1.1GZip Writer Interceptor

那讓我們來看看我們的GZip Writer Interceptor吧:

GZip Writer Interceptor

package org.codingpedia.demo.rest.interceptors;

import java.io.IOException;

import java.io.OutputStream;

import java.util.zip.GZIPOutputStream;

import javax.ws.rs.WebApplicationException;

import javax.ws.rs.core.MultivaluedMap;

import javax.ws.rs.ext.WriterInterceptor;

import javax.ws.rs.ext.WriterInterceptorContext;

@Provider

@Compress

public class GZIPWriterInterceptor implements WriterInterceptor {

@Override

public void aroundWriteTo(WriterInterceptorContext context)

throws IOException, WebApplicationException {

MultivaluedMap<String,Object> headers = context.getHeaders();

headers.add("Content-Encoding", "gzip");

final OutputStream outputStream = context.getOutputStream();

context.setOutputStream(new GZIPOutputStream(outputStream));

context.proceed();

}

}

注意:

它實現了WriterInterceptor,這是一個寫攔截器的消息體的介面,這個介麵包裝調用javax.ws.rs.ext.MessageBodyWriter.writeTo

供應商實現WriterInterceptor協議必須要麼以編程方式注冊進一個JAX-RS運行環境,要麼必須用@Provider註解來註解在一個提供商掃描語句期間自動的被JAX-RS運行環境發現。

@Compress是綁定註解的名稱,在接下來的段落中我們將更詳細的討論它

「攔截器從WriterInterceptorContext中獲得一個輸出流並且設置一個新的用原始的GZIP包裝器包裝的輸出流。在所有的攔截器被執行以後,輸出流最終設置WriterInterceptorContext將用於序列化實體。在上面的例子中,實體位元組將被寫到GZIPOutputStream中,這個類將壓縮流數據,然後把他們寫到原始輸出流。原始流總是把數據寫到wire中。當攔截器被用在伺服器上時,原始輸出流會把數據寫到底層伺服器容器的流中,然後發送響應給客戶端。」

「重載方法aroundWriteTo()獲取WriterInterceptorContextz作為參數。這個上下文包括請求頭參數getters和setters,請求屬性,實體,實體流和其它屬性;當你壓縮你的響應時,你應當設置'Content-Encoding'頭位gzip」

1.2 壓縮註解

過濾器和攔截器能被綁定名字。名稱綁定是一種概念,這種概念就是允許告訴一個JAX-RS的運行時,一個只為特定資源方法的特定的過濾器或者攔截器將被執行。當一個過濾器或者攔截器只對一些特定的資源方法限制,那我們就認為它是名稱綁定。過濾器和攔截器沒有這樣的限制就被稱作global。在我們的例子中我們已經構建了@Compress註解:

Compress annotation

package org.codingpedia.demo.rest.interceptors;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import javax.ws.rs.NameBinding;

//@Compress annotation is the name binding annotation

@NameBinding

@Retention(RetentionPolicy.RUNTIME)

public @interface Compress {}

而且用它來標記在資源上的方法,這個方法應該是被壓縮的(eg:當GET-ing的時候,所有的博客用PodcastsResource)

@Compress annotation在資源方法上的使用

@Component

@Path("/podcasts")

public class PodcastsResource {

@Autowired

private PodcastService podcastService;

...........................

/*

* *********************************** READ ***********************************

*/

/**

* Returns all resources (podcasts) from the database

*

* @return

* @throws IOException

* @throws JsonMappingException

* @throws JsonGenerationException

* @throws AppException

*/

@GET

@Compress

@Proces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })

public List<Podcast> getPodcasts(

@QueryParam("orderByInsertionDate") String orderByInsertionDate,

@QueryParam("numberDaysToLookBack") Integer numberDaysToLookBack)

throws IOException,AppException {

List<Podcast> podcasts = podcastService.getPodcasts(

orderByInsertionDate, numberDaysToLookBack);

return podcasts;

}

...........................

}

2.測試

2.1SOAPui

好了,如果你正在用SOAPui測試,你能使用下面的請求違反PodcastsResource

Reqest:

請求例子:

GET http://localhost:8888/demo-rest-jersey-spring/podcasts/?orderByInsertionDate=DESC HTTP/1.1

Accept-Encoding: gzip,deflate

Accept: application/json, application/xml

Host: localhost:8888

Connection: Keep-Alive

User-Agent: Apache-HttpClient/4.1.1 (java 1.5)

Response:

被壓縮的json響應,通過SOAPui自動的解壓縮

HTTP/1.1 200 OK

Content-Type: application/json

Content-Encoding: gzip

Content-Length: 409

Server: Jetty(9.0.7.v20131107)

[

{

"id": 2,

"title": "Quarks & Co - zum Mitnehmen",

"linkOnPodcastpedia": "http://www.podcastpedia.org/quarks",

"feed": "http://podcast.wdr.de/quarks.xml",

"description": "Quarks & Co: Das Wissenschaftsmagazin",

"insertionDate": "2014-10-29T10:46:13.00+0100"

},

{

"id": 1,

"title": "- The Naked Scientists Podcast - Stripping Down Science",

"linkOnPodcastpedia": "http://www.podcastpedia.org/podcasts/792/-The-Naked-Scientists-Podcast-Stripping-Down-Science",

"feed": "feed_placeholder",

"description": "The Naked Scientists flagship science show brings you a lighthearted look at the latest scientific breakthroughs, interviews with the world top scientists, answers to your science questions and science experiments to try at home.",

"insertionDate": "2014-10-29T10:46:02.00+0100"

}

]

SOAPui接受Content-type:gzip頭,我們在GZIPWriterIntercepter中添加了並且自動的解壓了響應並且用人眼可讀的方式展示出來。

好了,就這些了。你已經了解了Jersey如何讓它直接壓縮REST api響應了。

❸ 各位大俠,jersey rest 裡面get方法@Proces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }

沒有json數據類型的解析器,你引入jersey-json這個包試試

❹ java微服務架構有哪些

String boot 微型架構首選面xml配置一路使用默認的話你只需要寫核心邏輯,導出jar包就可以直接放在伺服器上用

❺ json中的date類型怎麼在js中判斷出來

JSON是一種數據格式抄,和JS對象雖然語法類似,但是還是有根本區別的。
JSON格式在傳輸時只能傳輸一些基本數據類型,如String、Number、Boolean。因此我想你說的date類型只是JSON數據中的一個字元串,例如:
var json = {

date : '2013-02-26 10:50:22'
}

你可以通過一個正則表達式來判斷是否為日期格式,如:
var reg = /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/;
var isDate = reg.test(json.date);

alert(isDate);

閱讀全文

與jersey解析json相關的資料

熱點內容
安卓平板通用刷機包下載 瀏覽:751
安卓獲取內部存儲路徑 瀏覽:880
寫代碼兩台顯示器 瀏覽:327
unitypackage壓縮文件 瀏覽:493
奕心安卓 瀏覽:563
使用土地的有關證明文件包含哪些 瀏覽:493
數據標注哪裡可以接 瀏覽:482
在家自學編程下什麼學 瀏覽:705
最近很火的app軟體是什麼軟體 瀏覽:862
ai文字工具 瀏覽:157
蘭博玩游戲路徑怎麼選擇正確文件 瀏覽:972
淘寶直通車恢復老版本 瀏覽:510
播放草莓的圖片我都文件 瀏覽:55
微信大文件打不開 瀏覽:767
家裝合同准備哪些文件 瀏覽:296
應用bat合並excel文件 瀏覽:984
迅雷影音文件夾 瀏覽:109
makefile的文件路徑 瀏覽:392
計算機程序文件名擴展名為 瀏覽:982
網路游戲推廣策劃案 瀏覽:609

友情鏈接