1. 程式人生 > >HTTP介面的服務端和客戶端的實現

HTTP介面的服務端和客戶端的實現

Json大量欄位案例(300多個key),需要做一個客戶中心抽調各個系統的客戶資訊的功能,在每個系統中需要寫客戶端程式碼,在客戶中心繫統需要寫服務端程式碼。

客戶端:

json串截圖如下,注意在json結構中有物件也有陣列也就是集合。在java類和json物件的互相轉換過程中,如果將json串轉換成java類物件,在裡層的特殊型別,也就是[]集合的,我們需要進行特殊的處理。


1.建立執行緒:(向客戶中心推送客戶資訊時,前提是不能影響本系統的流程,也就是說不管你藉口中的方法是否報錯藉口是否通都不能影響原始碼的正常秩序,因為我們新增了執行緒),內部類。

try {

Thread thread =

new Thread(new Runnable() {

publicvoid run() {

//次數寫客戶端呼叫介面的相關方法

}

});

thread.start();

} catch (Exception e) {

e.printStackTrace();

}

根據json的結構構建出對應的java類來。一層一層的寫java類,查詢出所有需要的資訊賦值到java類物件中後,將物件轉化成可以推送的json物件

JSONObject fromObject = JSONObject.fromObject(customerCenter,jsonExcludeEmpty());

private JsonConfig jsonExcludeEmpty(){

//去除空的json鍵值對

JsonConfig jsonConfig = new JsonConfig();

jsonConfig.setJsonPropertyFilter(new PropertyFilter() {

@Override

publicboolean apply(Object source, String name, Object value) {

return value == null;

}

});

return jsonConfig;

}

呼叫HTTP工具類推送資訊呼叫介面,最後獲得介面的返回值result.

同樣在獲取資料本系統做儲存時,呼叫介面後獲得返回值result


JSONObject jsonObject = JSONObject.fromObject(result);

String status = jsonObject.getString("status").trim();

//過濾掉不需要處理的json物件

JsonConfig  config=new JsonConfig ();

config.setExcludes(new String[]{"educationInfos","carInfo","houseInfo"});

JSONObject dataJSON = new JSONObject().fromObject(data,config);

//json轉java物件特殊的型別需要單獨處理,比如list [ ]中括號

Map<String, Class> classMap = new HashMap<String, Class>();

classMap.put("phones", CustomerCenterPhone.class);

classMap.put("companyPhones", CustomerCenterPhone.class);

classMap.put("emails", CustomerCenterEmail.class);

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

CustomerCenter customerCenter =(CustomerCenter)JSONObject.toBean(dataJSON,CustomerCenter.class,classMap);

這樣就獲得到了最外層整體的物件CustomerCenter ,在這個物件中,我做的這個專案有300多個欄位。裡面的物件和集合還是比較多的,在做的時候要仔細的核對好。


服務端:

       http服務端的程式碼一般不是在service類或是介面中寫,而是直接寫在controller中,因為是http的嘛,就和一個頁面訪問一樣先進入到controller層,類的註解不變還是@[email protected](value="/ApplicationController")兩個後面的是訪問的名稱。在方法上有了一些變化,先看下面的程式碼:

@RequestMapping(value="/approveResult",method = RequestMethod.POST)
    public void approveResult(@RequestBody PharosResultPojo pharosResultPojo,HttpServletRequest request,HttpServletResponse response){
        //PharosResultPojo 這個是接受資料的java類
        //裡面直接寫相應的功能,在處理完後,需要給呼叫者返回處理的結果
        PrintWriter out;
        out = response.getWriter();
        JSONObject result = new JSONObject();
        result.put("result", "ok");
        out.write(result.toString());
        out.flush();
        out.close();
}
//我們看到在除了平時要使用的方法訪問名稱後,又加了個引數method = RequestMethod.POST,這個就是規定你http服務端的這個介面方法是post還是get方式。在方法引數列表中要加上這個註解@RequestBody 以及HttpServletRequest request,HttpServletResponse response兩個引數。在controller中寫了以上的內容後我們只需要完成最後一步http服務端就完成了。那麼我們的java程式碼已經寫好了,想要和頁面上的一樣訪問到我們的後臺,那我們還需要一個什麼操作呢?既然是介面,那麼一般肯定是其它的系統訪問,我們知道的是自己系統的類其它類是不能直接去訪問的,我們需要將這個類給取消攔截,也就是讓其它系統可以訪問,這一步是在配置檔案中實現的,每個公司的專案的結構一般都不一樣,有很多公司是在applicationContext-security.xml這個xml中配置,

<b:bean id="resourceDetailsService"
        class="*********.security.ResourceDetailsServiceImp">
        <b:property name="filterURL">
            <b:map>
                <b:entry key="/ApplicationController/**" value="ROLE_ANONYMOUS" />
直接將這個類給取消攔截,具體的在xml中的寫法,有一些是公司封裝的比較詳細,如果你做的專案什麼都沒有的話,那麼你可以在網上搜索一下如何在spring mvc專案(我公司用的是spring mvc專案這個框架)中取消controller類的訪問攔截,應該很簡單的。