HTTP接口的服務端和客戶端的實現

Json大量字段案例(300多個key),需要做一個客戶中心抽調各個系統的客戶信息的功能,在每個系統中需要寫客戶端代碼,在客戶中心繫統需要寫服務端代碼。

客戶端:

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


1.創建線程:(向客戶中心推送客戶信息時,前提是不能影響本系統的流程,也就是說不管你藉口中的方法是否報錯藉口是否通都不能影響源代碼的正常秩序,因爲我們新增了線程),內部類。

try {

Thread thread = new Thread(new Runnable() {

public void 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

public boolean 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層,類的註解不變還是@Controller@RequestMapping(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類的訪問攔截,應該很簡單的。

    

發佈了58 篇原創文章 · 獲贊 72 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章