使用RESTful客戶端API進行GET / POST

互聯網上有很多如何使用RESTful Client API的東西。 這些是基礎。 但是,盡管該主題看起來微不足道,但仍然存在一些障礙,尤其是對于初學者而言。
在這篇文章中,我將嘗試總結我的專業知識,以及我如何在實際項目中做到這一點。 我通常使用Jersey(用于構建RESTful服務的參考實現)。 參見例如我的另一篇文章 。 在本文中,我將從JSF bean調用真正的遠程服務。 讓我們編寫一個會話范圍的bean RestClient。

package com.cc.metadata.jsf.controller.common;import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;import java.io.Serializable;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;/*** This class encapsulates some basic REST client API.*/
@ManagedBean
@SessionScoped
public class RestClient implements Serializable {private transient Client client;public String SERVICE_BASE_URI;@PostConstructprotected void initialize() {FacesContext fc = FacesContext.getCurrentInstance();SERVICE_BASE_URI = fc.getExternalContext().getInitParameter('metadata.serviceBaseURI');client = Client.create();}public WebResource getWebResource(String relativeUrl) {if (client == null) {initialize();}return client.resource(SERVICE_BASE_URI + relativeUrl);}public ClientResponse clientGetResponse(String relativeUrl) {WebResource webResource = client.resource(SERVICE_BASE_URI + relativeUrl);return webResource.accept('application/json').get(ClientResponse.class);}
}

在此類中,我們獲得了在web.xml中指定(配置)的服務基礎URI。

<context-param><param-name>metadata.serviceBaseURI</param-name><param-value>http://somehost/metadata/</param-value>
</context-param>

此外,我們編寫了兩種方法來接收遠程資源。 我們打算接收JSON格式的資源,并將其轉換為Java對象。 下一個bean演示了如何對GET請求執行此任務。 Bean HistoryBean通過使用GsonConverter將接收到的JSON轉換為Document對象。 最后兩節將不在此處顯示(沒關系)。 Document是一個簡單的POJO,而GsonConverter是一個包裝Gson的單例實例。

package com.cc.metadata.jsf.controller.history;import com.cc.metadata.jsf.controller.common.RestClient;
import com.cc.metadata.jsf.util.GsonConverter;
import com.cc.metadata.model.Document;import com.sun.jersey.api.client.ClientResponse;import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;/*** Bean getting history of the last extracted documents.*/
@ManagedBean
@ViewScoped
public class HistoryBean implements Serializable {@ManagedProperty(value = '#{restClient}')private RestClient restClient;private List<Document> documents;private String jsonHistory;public List<Document> getDocuments() {if (documents != null) {return documents;}ClientResponse response = restClient.clientGetResponse('history');if (response.getStatus() != 200) {throw new RuntimeException('Failed service call: HTTP error code : ' + response.getStatus());}// get history as JSONjsonHistory = response.getEntity(String.class);// convert to Java array / list of Document instancesDocument[] docs = GsonConverter.getGson().fromJson(jsonHistory, Document[].class);documents = Arrays.asList(docs);return documents;}// getter / setter...
}

下一個bean演示了如何通過POST與遠程服務進行通信。 我們打算發送上傳文件的內容。 我使用PrimeFaces的 FileUpload組件,以便可以從偵聽器的參數FileUploadEvent中提取內容作為InputStream。 這在這里并不重要,您還可以使用任何其他Web框架來獲取文件內容(也可以作為字節數組)。 更重要的是,看看如何處理RESTful Client類FormDataMultiPart和FormDataBodyPart。

package com.cc.metadata.jsf.controller.extract;import com.cc.metadata.jsf.controller.common.RestClient;
import com.cc.metadata.jsf.util.GsonConverter;
import com.cc.metadata.model.Document;import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.core.header.FormDataContentDisposition;
import com.sun.jersey.multipart.FormDataBodyPart;
import com.sun.jersey.multipart.FormDataMultiPart;import org.primefaces.event.FileUploadEvent;import java.io.IOException;
import java.io.Serializable;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;import javax.ws.rs.core.MediaType;/*** Bean for extracting document properties (metadata).*/
@ManagedBean
@ViewScoped
public class ExtractBean implements Serializable {@ManagedProperty(value = '#{restClient}')private RestClient restClient;private String path;public void handleFileUpload(FileUploadEvent event) throws IOException {String fileName = event.getFile().getFileName();FormDataMultiPart fdmp = new FormDataMultiPart();FormDataBodyPart fdbp = new FormDataBodyPart(FormDataContentDisposition.name('file').fileName(fileName).build(),event.getFile().getInputstream(), MediaType.APPLICATION_OCTET_STREAM_TYPE);fdmp.bodyPart(fdbp);WebResource resource = restClient.getWebResource('extract');ClientResponse response = resource.accept('application/json').type(MediaType.MULTIPART_FORM_DATA).post(ClientResponse.class, fdmp);if (response.getStatus() != 200) {throw new RuntimeException('Failed service call: HTTP error code : ' + response.getStatus());}// get extracted document as JSONString jsonExtract = response.getEntity(String.class);// convert to Document instanceDocument doc = GsonConverter.getGson().fromJson(jsonExtract, Document.class);...}// getter / setter...
}

最后但并非最不重要的一點,我想演示如何使用任何查詢字符串(URL參數)發送GET請求。 下一個方法通過看起來像http:// somehost / metadata / extract?file = <some file path>的URL詢問遠程服務。

public void extractFile() {WebResource resource = restClient.getWebResource('extract');ClientResponse response = resource.queryParam('file', path).accept('application/json').get(ClientResponse.class);if (response.getStatus() != 200) {throw new RuntimeException('Failed service call: HTTP error code : ' + response.getStatus());}// get extracted document as JSONString jsonExtract = response.getEntity(String.class);// convert to Document instanceDocument doc = GsonConverter.getGson().fromJson(jsonExtract, Document.class);...
}

參考:在我們的軟件開發博客上,來自我們JCG合作伙伴 Oleg Varaksin的RESTful Client API進行GET / POST 。

翻譯自: https://www.javacodegeeks.com/2013/01/get-post-with-restful-client-api.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/370111.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370111.shtml
英文地址,請注明出處:http://en.pswp.cn/news/370111.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

南昌互聯網行業協會籌辦者祝真和華罡團隊-2014年12月江西IDC排行榜

&#xfeff;&#xfeff;他出自軍營&#xff0c;擁有一身正氣。 他在南昌創業&#xff0c;立意卓越。 從站點開始、到微營銷、到線上教育&#xff0c;全面開花。 他在朋友圈看到不對的內容&#xff0c;就會即時批評。 他對朋友&#xff0c;又是很的和藹可親。 他就是南昌華罡網…

Linux下查看某個進程的網絡帶寬占用情況

說明&#xff1a; 1、可能查看某個進程的帶寬占用需要明確知道PID、進程名字、發送速度、接收速度。 2、很遺憾&#xff0c;在Linux原生的軟件中沒有這樣的一款&#xff0c;只能額外裝&#xff0c;最符合以上的情況就只有nethogs。 3、nethogs可以指定網卡&#xff0c;但是不能…

android中的add方法,Android入門之addWindow

前面說到&#xff0c;應用程序添加窗口時&#xff0c;會在本地創建一個ViewRoot&#xff0c;然后通過IPC(進程間通信)調用WmS的Session的addWindow請求WmS創建窗口&#xff0c;下面來看看addWindow方法。addWindow方法定義在frameworks/base/services/java/com.android.server.…

CSS屬性速查表

前面的話 本文將按照布局類屬性、盒模型屬性、文本類屬性、修飾類屬性這四個分類&#xff0c;對CSS常用屬性進行重新排列&#xff0c;并最終設置為一份stylelintrc文件 布局類 1、定位 positionz-indextopbottomleftright 2、浮動 floatclear 3、多列布局 columnscolumns-width…

我應該使用32位還是64位JVM?

這是我在企業軟件開發生涯中多次遇到的問題。 我不得不每隔一段時間就提供有關配置特定新環境的建議。 而且&#xff0c;很多時候&#xff0c;手頭的問題與“我應該使用32位或64位JVM”有關。 老實說&#xff0c;一開始我只是擲硬幣。 而不是給出合理的答案。 &#xff08;對不…

python安裝pyecharts清華_基于Python安裝pyecharts所遇的問題及解決方法

最近學習到數據可視化內容&#xff0c;老師推薦安裝pyecharts&#xff0c;于是pip install 了一下&#xff0c;結果...掉坑了&#xff0c;下面是我的跳坑經驗&#xff0c;如果你有類似問題&#xff0c;希望對你有所幫助。第一個坑:這個不難理解&#xff0c;缺少pyecharts-jupyt…

C語言內存分配

C語言內存分配 C語言的內存分配主要有5個區域&#xff1a; 1、棧區&#xff1a;在運行函數時&#xff0c;函數內的局部變量&#xff08;不包含static變量&#xff09;、函數返回值的存儲單元在棧區上創建。函數運行結束時這些存儲單元自己主動被釋放。棧區內存分配運算內置于處…

在Ajax方式產生的浮動框中,點擊選項包含某個關鍵字的選項

#!usr/bin/env python #-*- coding:utf-8 -*- """ author: sleeping_cat Contact : zwy24zwy163.com """ #在Ajax方式產生的浮動框中&#xff0c;點擊選項包含某個關鍵字的選項 #通過模擬鍵盤下箭頭進行選擇懸浮框選項from selenium imp…

android studio點擊圖片,如何在Android Studio中的模擬器圖庫中添加圖像?

如何在Android Studio中的模擬器圖庫中添加圖像&#xff1f;我正在開發圖像過濾器應用程序。 但是&#xff0c;如果我沒有任何圖像&#xff0c;就無法真正嘗試。我知道我可以在電話中對其進行測試&#xff0c;但這并不相同&#xff0c;因為我需要錯誤消息和其他內容。我只想從A…

移動端學習目錄

前面的話 iphone4發布是幾年前的事情&#xff0c;而如今早已是移動互聯網的時代。人們不再正襟危坐在電腦前&#xff0c;而更愿意把時間耗費在手機上&#xff0c;隨時隨地地享受互聯網。在移動端可以使用最新最炫的前端技術&#xff0c;而不用再考慮老版本IE的兼容性。當前&…

實踐中的構建者模式

我將不深入討論該模式&#xff0c;因為已經有大量的帖子和書籍對此進行了詳細的解釋。 相反&#xff0c;我將告訴您為什么以及何時應該考慮使用它。 但是&#xff0c;值得一提的是&#xff0c;這種模式與《 四人幫》一書中介紹的模式有些不同。 雖然原始模式著重于抽象化構造步…

python計算汽車的平均油耗_用python對汽車油耗進行數據分析

原標題&#xff1a;用python對汽車油耗進行數據分析- 從http://fueleconomy.gov/geg/epadata/vehicles.csv.zip下載汽車油耗數據集并解壓- 進入jupyter notebook(ipython notebook)并新建一個New Notebook- 輸入命令[python]view plaincopyimportpandas as pdimportnumpy as np…

git常用命令2

##一、git常用命令 ###1、 push文件 * 打開cmd窗口 * 輸入f:&#xff0c;進入f:&#xff08;自己隨便在自己的電腦上找個位置就行了&#xff0c;這里的f:&#xff0c;表示的是f盤&#xff09; * 然后輸入mkdir workSpace&#xff0c;會自動在f盤下生成一個workSpace文件夾 * 然…

android移動應用基礎教程源代碼,Android移動應用基礎教程 【程序活動單元Activity】...

本章目錄一、Activity的生命周期1、生命周期狀態2 、生命周期方法3、橫豎屏切換時的生命周期二、Activity的創建配置和關閉1、Activity的創建2、配置Activity3、開啟和關閉Activity三、Intent與IntentFilter1、Intent介紹1.1 意圖的概念1.2 顯式意圖1.3 隱式意圖2、IntentFilte…

elasticsearch中cluster和transport知識

elasticsearch cluster 概述 elasticsearch節點間通信的基礎transport轉載于:https://www.cnblogs.com/wzj4858/p/8126033.html

Python中使用subplot在一張畫布上顯示多張圖

subplot(arg1, arg2, arg3) arg1: 在垂直方向同時畫幾張圖arg2: 在水平方向同時畫幾張圖arg3: 當前命令修改的是第幾張圖 t np.arange(0,5,0.1) y1 np.sin(2*np.pi*t) y2 np.sin(2*np.pi*t) plt.subplot(211) plt.plot(t,y1,b-.) plt.subplot(212) plt.plot(t,y2,r--) plt.s…

Java 8:從PermGen到元空間

您可能已經知道&#xff0c;現在可以下載JDK 8 Early Access 。 這使Java開發人員可以嘗試Java 8的一些新語言和運行時功能。這些功能之一是完全刪除自Oracle自JDK 7發行以來就宣布的Permanent Generation&#xff08;PermGen&#xff09;空間。例如&#xff0c;自JDK 7起&…

oracle symonym_ORACLE SYNONYM詳解

以下內容整理自Oracle 官方文檔一 概念A synonym is an alias for any table, view,materialized view, sequence, procedure, function, package, type, Java classschema object, user-defined object type, or another synonym. Because a synonymis simply an alias, it re…

瀏覽器緩存問題原理以及解決方案

瀏覽器緩存問題&#xff1a; 簡單來說&#xff0c;瀏覽器緩存就是把一個已經請求過的Web資源&#xff08;如html頁面&#xff0c;圖片&#xff0c;js&#xff0c;數據等&#xff09;拷貝一份副本儲存在瀏覽器中。緩存會根據進來的請求保存輸出內容的副本。當下一個請求來到的時…

Scikit-Learn機器學習入門

現在最常用的數據分析的編程語言為R和Python。每種語言都有自己的特點&#xff0c;Python因為Scikit-Learn庫贏得了優勢。Scikit-Learn有完整的文檔&#xff0c;并實現很多機器學習算法&#xff0c;而每種算法使用的接口幾乎相同&#xff0c;可以非常快的測試其它學習算法。 Pa…