Ⅰ 泛型方法,RESTful應用問題,怎麼解決
public static <T> void synInfoForTable(Class<T> clazz, List<T>){}
其中T是不能調用任何方法的,想要T的類型,只能傳Class<T> clazz。
那麼這個T怎麼用呢?你就把T認為是一個返回類型:
比如在方法中
List<T> tblInfoListFromDB = new LinkedList<T>(query.list());
for (T tblInfoAPI : tblInfoListFromAPI) {}
就是對T的使用。
下面例子是一個同步案例:
/**
* 將信息更新到資料庫(同步)
*
* @param clazz
* 實體類對應的class
* @param compareField
* 從API獲取的對象與資料庫中的對象要比較的欄位,首字母大寫,只能比較字元串
* @param primaryKeyField
* 實體對象的主鍵欄位,首字母大寫
* @param primaryKeyClass
* 主鍵欄位對應的class
* @param tblInfoListFromAPI
* 從API獲取的對象集合
* @throws H3cException
*/
public static <T> void synInfoForTable(Class<T> clazz, String compareField, String primaryKeyField,
Class<?> primaryKeyClass, List<T> tblInfoListFromAPI, Integer cloudSign, String... userId)
throws Exception {
Session session = HBUtil.openNewSession();
Transaction t = null;
try {
t = session.beginTransaction();
StringBuilder hql = new StringBuilder("from ");
hql.append(clazz.getSimpleName());
hql.append(" where cloudId IS NOT NULL AND deleted = :deleted AND cloudSign = :cloudSign");
if (userId.length > 0) {// 如果要根據用戶同步,那麼在查詢時先查詢出該用戶的資源
hql.append(" AND userId = :userId");
}
Query query = session.createQuery(hql.toString());
query.setInteger("deleted", 0);// 只取未刪除的
query.setInteger("cloudSign", cloudSign);
if (userId.length > 0) {
query.setString("userId", userId[0]);
}
@SuppressWarnings("unchecked")
List<T> tblInfoListFromDB = new LinkedList<T>(query.list());
Method compareMethod = clazz.getMethod("get" + compareField);
Method getPrimaryKeyMethod = clazz.getMethod("get" + primaryKeyField);
Method setPrimaryKeyMethod = clazz.getMethod("set" + primaryKeyField, primaryKeyClass);
for (T tblInfoAPI : tblInfoListFromAPI) {// 使用增強循環
boolean flag = true;
String compareAPI = (String) compareMethod.invoke(tblInfoAPI);
for (T tblInfoDB : tblInfoListFromDB) {
String compareDB = (String) compareMethod.invoke(tblInfoDB);
if (compareAPI.equals(compareDB)) { // db方後面的原因是可能為空
if (!tblInfoAPI.equals(tblInfoDB)) {// 如果對象有變化,就要更新,否則不更新
// 為了防止主鍵被置為空,所以最後還要將原先的主鍵值保留下來,並賦值回去
// 這步如果之前已經賦值過,就沒必要做了
Object primaryKeyValue = getPrimaryKeyMethod.invoke(tblInfoDB);
CopyIgnoreProperty.(tblInfoAPI, tblInfoDB);
if (getPrimaryKeyMethod.invoke(tblInfoDB) == null) {
setPrimaryKeyMethod.invoke(tblInfoDB, primaryKeyValue);
}
session.update(tblInfoDB);
}
// 從集合中移除存在,是為了下面移除不存在的
tblInfoListFromDB.remove(tblInfoDB);
flag = false;
break;
}
}
if (flag) {// true為api新增的
// 如果主鍵是String類型(不會自動增長)的,且如果沒有被賦值,那麼就給他賦值
// 字元串,36長度的
if ((getPrimaryKeyMethod.invoke(tblInfoAPI) == null) && (primaryKeyClass == String.class)) {
setPrimaryKeyMethod.invoke(tblInfoAPI, UUIDHexUtil.generate36bit());
}
session.save(tblInfoAPI);
}
}
// 因為前面tblVmInfoListFromDB已經把存在的都移除了,剩下的都是不存在了的
for (T tblInfoDB : tblInfoListFromDB) {
session.delete(tblInfoDB);
}
// 只要commit沒有執行,就不會保存數據
t.commit();
} catch (Exception e) {
if (t != null) {
t.rollback();
}
throw new Exception("資料庫同步異常:" + e.getMessage(), e);// 調用者會說明是什麼異常
} finally {
session.close();
}
Ⅱ 什麼是 RESTful 到底 REST 和 SOAP,RPC 有何區別
第一個問題:什麼是RESTful?
REST這個詞,是Roy Thomas Fielding在他2000年的博士論文中提出的。有興趣可以看看這里論文`,誰是Fielding?點擊前面名字了解。
那RESTful到底是什麼呢?簡單的講,它是:一種架構設計風格,提供了設計原則和約束條件,而不是架構。而滿足這些約束條件和原則的應用程序或設計就是 RESTful架構或服務。
推薦閱讀:
張善友博客——REST 入門介紹
infoq——深入淺出REST
第二個問題:到底 REST 和 SOAP、RPC 有何區別?
這個問題比較大,要知道他們有什麼區別首先需要明白,他們分別是什麼?
REST上面已經簡單的說明了它是什麼。
SOAP(簡單對象訪問協議)是什麼?SOAP是一種數據交換協議規范,是一種輕量的、簡單的、基於XML的協議的規范。它有什麼優點?簡單總結為: 易用,靈活,跨語言,跨平台。
易用:是因為它的消息是基於xml並封裝成了符合http協議,因此,它符合任何路由器、 防火牆或代理伺服器的要求。
靈活:表現在極具拓展性,SOAP 無需中斷已有的應用程序, SOAP 客戶端、 伺服器和協議自身都能發展。而且SOAP 能極好地支持中間介質和層次化的體系結構。
跨語言:soap可以使用任何語言來完成,只要發送正確的soap請求即可。
跨平台:基於soap的服務可以在任何平台無需修改即可正常使用。
RPC(遠程調用框架) 是一種允許分布式應用程序調用網路上不同計算機的可用服務的機制。涉獵不多,一下省略256個字。有熟悉的朋友可以在評論補充,然後我會修改到該內容中去
從上面我們可以看出,REST 和 SOAP、RPC 有何區別呢?沒什麼太大區別,他們的本質都是提供可支持分布式的基礎服務,最大的區別在於他們各自的的特點所帶來的不同應用場景。
REST可以看著是http協議的一種直接應用,默認基於json作為傳輸格式,使用簡單,學習成本低效率高,~~但是安全性較低~~,而SOAP可以看著是一個重量級的協議,基於xml,SOAP在安全方面是通過使用XML-Security和XML-Signature兩個規范組成了WS-Security來實現安全控制的,當前已經得到了各個廠商的支持,.net ,php ,java 都已經對其有了很好的支持 。這是REST薄弱的地方。
Ⅲ 如何理解rest和restful,什麼是restfulAPI
簡單理解一
就是用URL定位資源,用HTTP描述操作。
簡單理解二
URL定位資源,用HTTP動詞(GET,POST,DELETE,DETC)描述操作。
官方定義
一種軟體架構風格、設計風格,而不是標准,只是提供了一組設計原則和約束條件。它主要用於客戶端和伺服器交互類的軟體。基於這個風格設計的軟體可以更簡潔,更有層次,更易於實現緩存等機制。
以web開發舉例
在設計web介面的時候,REST主要是用於定義介面名,介面名一般是用名次寫,不用動詞,那怎麼表達「獲取」或者「刪除」或者「更新」這樣的操作呢——用請求類型來區分。
比如,我們有一個students介面,對於「學生」我們有增刪改查四種操作,怎麼定義REST介面?
增加一個學生,uri: http://testcode.com/school/students 介面類型:POST
刪除一個朋友,uri: http://testcode.com/school/students 介面類型:DELETE
修改一個朋友,uri: http://testcode.com/school/students 介面類型:PUT
查找朋友,uri: http://testcode.com/school/students 介面類型:GET
上面我們定義的四個介面就是符合REST協議的,請注意,這幾個介面都沒有動詞,只有名詞students,都是通過Http請求的介面類型來判斷是什麼業務操作。
舉個反例
uri: http://testcode.com/school/addStudents 該介面用來表示增加學生,這就是不符合REST協議的介面。
建議
用HTTP Status Code傳遞Server的狀態信息。比如最常用的 200 表示成功,500 表示Server內部錯誤,403表示Bad Request等。(反例:傳統web開發返回的狀態碼一律都是200,其實不可取。)
REST風格介面意義
前後端分離。前端拿到數據只負責展示和渲染,不對數據做任何處理。後端處理數據並以JSON格式傳輸出去,定義這樣一套統一的介面,在web,ios,android三端都可以用相同的介面,節約開發成本以及便於同一調試。
Ⅳ 怎樣用通俗的語言解釋什麼叫 REST,以及什麼是 RESTful
REST (REpresentation State Transfer) 描述了一個架構樣式的網路系統,比如 web 應用程序。它首次出現在 2000 年 Roy Fielding 的博士論文中,他是 HTTP 規范的主要編寫者之一。REST 指的是一組架構約束條件和原則。滿足這些約束條件和原則的應用程序或設計就是 RESTful。Web 應用程序最重要的 REST 原則是,客戶端和伺服器之間的交互在請求之間是無狀態的。從客戶端到伺服器的每個請求都必須包含理解請求所必需的信息。如果伺服器在請求之間的任何時間點重啟,客戶端不會得到通知。此外,無狀態請求可以由任何可用伺服器回答,這十分適合雲計算之類的環境。客戶端可以緩存數據以改進性能。在伺服器端,應用程序狀態和功能可以分為各種資源。資源是一個有趣的概念實體,它向客戶端公開。資源的例子有:應用程序對象、資料庫記錄、演算法等等。每個資源都使用 URI (Universal Resource Identifier) 得到一個惟一的地址。所有資源都共享統一的界面,以便在客戶端和伺服器之間傳輸狀態。使用的是標準的 HTTP 方法,比如 GET、PUT、POST 和 DELETE。Hypermedia 是應用程序狀態的引擎,資源表示通過超鏈接互聯。另一個重要的 REST 原則是分層系統,這表示組件無法了解它與之交互的中間層以外的組件。通過將系統知識限制在單個層,可以限制整個系統的復雜性,促進了底層的獨立性。當REST 架構的約束條件作為一個整體應用時,將生成一個可以擴展到大量客戶端的應用程序。它還降低了客戶端和伺服器之間的交互延遲。統一界面簡化了整個系統架構,改進了子系統之間交互的可見性。REST 簡化了客戶端和伺服器的實現。RESTful的實現:RESTful Web 服務與 RPC 樣式的 Web 服務了解了什麼是什麼是REST,我們再看看RESTful的實現。最近,使用 RPC 樣式架構構建的基於 SOAP 的 Web 服務成為實現 SOA 最常用的方法。RPC 樣式的 Web 服務客戶端將一個裝滿數據的信封(包括方法和參數信息)通過 HTTP 發送到伺服器。伺服器打開信封並使用傳入參數執行指定的方法。方法的結果打包到一個信封並作為響應發回客戶端。客戶端收到響應並打開信封。每個對象都有自己獨特的方法以及僅公開一個 URI 的 RPC 樣式 Web 服務,URI 表示單個端點。它忽略 HTTP 的大部分特性且僅支持 POST 方法。由於輕量級以及通過 HTTP 直接傳輸數據的特性,Web 服務的 RESTful 方法已經成為最常見的替代方法。可以使用各種語言(比如 Java 程序、Perl、Ruby、Python、PHP 和 Javascript[包括 Ajax])實現客戶端。RESTful Web 服務通常可以通過自動客戶端或代表用戶的應用程序訪問。但是,這種服務的簡便性讓用戶能夠與之直接交互,使用它們的 Web 瀏覽器構建一個 GET URL 並讀取返回的內容。在REST 樣式的 Web 服務中,每個資源都有一個地址。資源本身都是方法調用的目標,方法列表對所有資源都是一樣的。這些方法都是標准方法,包括 HTTP GET、POST、PUT、DELETE,還可能包括 HEADER 和 OPTIONS。在RPC 樣式的架構中,關注點在於方法,而在 REST 樣式的架構中,關注點在於資源 —— 將使用標准方法檢索並操作信息片段(使用表示的形式)。資源表示形式在表示形式中使用超鏈接互聯。Leonard Richardson 和 Sam Ruby 在他們的著作 RESTful Web Services 中引入了術語 REST-RPC 混合架構。REST-RPC 混合 Web 服務不使用信封包裝方法、參數和數據,而是直接通過 HTTP 傳輸數據,這與 REST 樣式的 Web 服務是類似的。但是它不使用標準的 HTTP 方法操作資源。它在 HTTP 請求的 URI 部分存儲方法信息。好幾個知名的 Web 服務,比如 Yahoo 的 Flickr API 和 del.icio.us API 都使用這種混合架構。RESTful的實現:RESTful Web 服務的 Java 框架有兩個 Java 框架可以幫助構建 RESTful Web 服務。erome Louvel 和 Dave Pawson 開發的 Restlet(見 參考資料)是輕量級的。它實現針對各種 RESTful 系統的資源、表示、連接器和媒體類型之類的概念,包括 Web 服務。在 Restlet 框架中,客戶端和伺服器都是組件。組件通過連接器互相通信。該框架最重要的類是抽象類 Uniform 及其具體的子類 Restlet,該類的子類是專用類,比如 Application、Filter、Finder、Router 和 Route。這些子類能夠一起處理驗證、過濾、安全、數據轉換以及將傳入請求路由到相應資源等操作。Resource 類生成客戶端的表示形式。JSR-311是 Sun Microsystems 的規范,可以為開發 RESTful Web 服務定義一組 Java API。Jersey是對 JSR-311 的參考實現。JSR-311 提供一組注釋,相關類和介面都可以用來將 Java 對象作為 Web 資源展示。該規范假定 HTTP 是底層網路協議。它使用注釋提供 URI 和相應資源類之間的清晰映射,以及 HTTP 方法與 Java 對象方法之間的映射。API 支持廣泛的 HTTP 實體內容類型,包括 HTML、XML、JSON、GIF、JPG 等。它還將提供所需的插件功能,以允許使用標准方法通過應用程序添加其他類型。RESTful的實現:構建 RESTful Web 服務的多層架構RESTful Web 服務和動態 Web 應用程序在許多方面都是類似的。有時它們提供相同或非常類似的數據和函數,盡管客戶端的種類不同。例如,在線電子商務分類網站為用戶提供一個瀏覽器界面,用於搜索、查看和訂購產品。如果還提供 Web 服務供公司、零售商甚至個人能夠自動訂購產品,它將非常有用。與大部分動態 Web 應用程序一樣,Web 服務可以從多層架構的關注點分離中受益。業務邏輯和數據可以由自動客戶端和 GUI 客戶端共享。惟一的不同點在於客戶端的本質和中間層的表示層。此外,從數據訪問中分離業務邏輯可實現資料庫獨立性,並為各種類型的數據存儲提供插件能力。圖1 展示了自動化客戶端,包括 Java 和各種語言編寫的腳本,這些語言包括 Python、Perl、Ruby、PHP 或命令行工具,比如 curl。在瀏覽器中運行且作為 RESTful Web 服務消費者運行的 Ajax、Flash、JavaFX、GWT、博客和 wiki 都屬於此列,因為它們都代表用戶以自動化樣式運行。自動化 Web 服務客戶端在 Web 層向 Resource Request Handler 發送 HTTP 響應。客戶端的無狀態請求在頭部包含方法信息,即 POST、GET、PUT 和 DELETE,這又將映射到 Resource Request Handler 中資源的相應操作。每個請求都包含所有必需的信息,包括 Resource Request Handler 用來處理請求的憑據。從Web 服務客戶端收到請求之後,Resource Request Handler 從業務邏輯層請求服務。Resource Request Handler 確定所有概念性的實體,系統將這些實體作為資源公開,並為每個資源分配一個惟一的 URI。但是,概念性的實體在該層是不存在的。它們存在於業務邏輯層。可以使用 Jersey 或其他框架(比如 Restlet)實現 Resource Request Handler,它應該是輕量級的,將大量職責工作委託給業務層。Ajax 和 RESTful Web 服務本質上是互為補充的。它們都可以利用大量 Web 技術和標准,比如 HTML、JavaScript、瀏覽器對象、XML/JSON 和 HTTP。當然也不需要購買、安裝或配置任何主要組件來支持 Ajax 前端和 RESTful Web 服務之間的交互。RESTful Web 服務為 Ajax 提供了非常簡單的 API 來處理伺服器上資源之間的交互。圖1 中的 Web 瀏覽器客戶端作為 GUI 的前端,使用表示層中的 Browser Request Handler 生成的 HTML 提供顯示功能。Browser Requester Handler 可以使用 MVC 模型(JSF、Struts 或 Spring 都是 Java 的例子)。它從瀏覽器接受請求,從業務邏輯層請求服務,生成表示並對瀏覽器做出響應。表示供用戶在瀏覽器中顯示使用。表示不僅包含內容,還包含顯示的屬性,比如 HTML 和 CSS。 業務規則可以集中到業務邏輯層,該層充當表示層和數據訪問層之間的數據交換的中間層。數據以域對象或值對象的形式提供給表示層。從業務邏輯層中解耦 Browser Request Handler 和 Resource Request Handler 有助於促進代碼重用,並能實現靈活和可擴展的架構。此外,由於將來可以使用新的 REST 和 MVC 框架,實現它們變得更加容易,無需重寫業務邏輯層。數據訪問層提供與數據存儲層的交互,可以使用 DAO 設計模式或者對象-關系映射解決方案(如 Hibernate、OJB 或 iBATIS)實現。作為替代方案,業務層和數據訪問層中的組件可以實現為 EJB 組件,並取得 EJB 容器的支持,該容器可以為組件生命周期提供便利,管理持久性、事務和資源配置。但是,這需要一個遵從 Java EE 的應用伺服器(比如 JBoss),並且可能無法處理 Tomcat。該層的作用在於針對不同的數據存儲技術,從業務邏輯中分離數據訪問代碼。數據訪問層還可以作為連接其他系統的集成點,可以成為其他 Web 服務的客戶端。數據存儲層包括資料庫系統、LDAP 伺服器、文件系統和企業信息系統(包括遺留系統、事務處理系統和企業資源規劃系統)。使用該架構,您可以開始看到 RESTful Web 服務的力量,它可以靈活地成為任何企業數據存儲的統一 API,從而向以用戶為中心的 Web 應用程序公開垂直數據,並自動化批量報告腳本。什麼是REST:結束語REST 描述了一個架構樣式的互聯系統(如 Web 應用程序)。REST 約束條件作為一個整體應用時,將生成一個簡單、可擴展、有效、安全、可靠的架構。由於它簡便、輕量級以及通過 HTTP 直接傳輸數據的特性,RESTful Web 服務成為基於 SOAP 服務的一個最有前途的替代方案。用於 web 服務和動態 Web 應用程序的多層架構可以實現可重用性、簡單性、可擴展性和組件可響應性的清晰分離。Ajax 和 RESTful Web 服務本質上是互為補充的。
Ⅳ restful 裡面的provider和interceptor的區別
區別是:
provider指的是供應者,提供者,(尤指)維持家庭生計者。
interceptor指的是攔截機。
例句辨析:
provider
1、Many mothers see their son as a potential protector and provider.
許多母親將兒子看成是未來的保護人和贍養人。
2、Some see themselves as the provider of ideas, while others view their role as essentially managerial.
有些人自認為是出謀劃策的人,其他人則認為他們主要是起管理方面的作用。
3、It was not the done thing. In those days the man was supposed to be the provider.
那不符合社會習俗。在那個年代,養家的應該是男人。
interceptor
1、Channel: This is the first interceptor in the chain.
通道:這是鏈中的第一個攔截器。
2、Coordinator: This is the last interceptor in the chain.
協調器:這是鏈中的最後一個攔截器。
3、You must deploy the stock quote service and the interceptor on both the client andthe server side.
您必須在客戶機端和伺服器端部署股票報價服務和攔截器。
Ⅵ Python課程內容都學習什麼啊
賀聖軍Python輕松入門到項目實戰(經典完整版)(超清視頻)網路網盤
鏈接: https://pan..com/s/1C9k1o65FuQKNe68L3xEx3w
若資源有問題歡迎追問~
Ⅶ Ajax調用restful介面傳送Json格式數據的方法
ajax傳送json格式數據,關鍵是指定contentType,data要是json格式
如果是restful介面,把type改成對應的post(增)、delete(刪)、put(改)、get(查)即可
var
post_data={"name":"test001","pass":"xxxx"};
$.ajax({
url:
"http://192.168.10.111:8080/uc/login",
type:
'post',
contentType:
"application/json;
charset=utf-8",
data:JSON.stringify(post_data),
success:function
(data)
{
//調用成功
},
error:
function(data,
textStatus,
errorThrown){
//調用失敗
}
});
以上所述是小編給大家介紹的Ajax調用restful介面傳送Json格式數據的方法的全部敘述,希望對大家有所幫助,如果大家想了解更多內容敬請關注腳本之家網站!
Ⅷ 怎麼接收restful返回的數據
首先Map的形式是最不推薦的。前端需要的數據必定是靈活多變的,我們可以創建多個VO,DTO來滿足不同的介面調用。
比如用戶User中包含密碼,而返回前端的數據不能包含密碼等敏感欄位,我們可以創建UserVO,返回不帶密碼的數據。你可以通過「領域驅動」進一步了解相關VO,DTO,PO等的區別和使用。
你可能會說,為表現層專門創建VO較為繁瑣,bean之間的轉換成了問題。
這里推薦使用mapstruct。mapstruct使用註解驅動完成轉換代碼的生成,你只需要提供Mapper介面即可。
比如User 和 UserVO 的轉換:
@Mapper(componentModel = "spring", uses = {})
public interface UserMapper {
UserVO userToUserVO(User user);
}