隨著Web 2.0的發(fā)展,越來(lái)越多的Web應(yīng)用程序采用JSON(JavaScript Object Notation)作為數(shù)據(jù)交換格式。然而,早期的Web服務(wù)技術(shù)如SOAP(Simple Object Access Protocol)卻主要采用XML作為數(shù)據(jù)交換格式。這對(duì)于使用SOAP的應(yīng)用程序來(lái)說(shuō)是一個(gè)問(wèn)題,因?yàn)檗D(zhuǎn)換XML和JavaScript對(duì)象之間的轉(zhuǎn)換非常耗時(shí)。
Apache Axis是一個(gè)非常流行的Java Web服務(wù)框架,已經(jīng)被廣泛用于SOAP Web服務(wù)的開(kāi)發(fā)。不過(guò),通過(guò)一些修改,我們可以使它支持使用JSON作為數(shù)據(jù)交換格式。
// 創(chuàng)建HTTP發(fā)送器 MultiThreadedHttpConnectionManager manager = new MultiThreadedHttpConnectionManager(); HttpConnectionManagerParams params = new HttpConnectionManagerParams(); params.setMaxTotalConnections(20); params.setDefaultMaxConnectionsPerHost(4); manager.setParams(params); HttpClient httpClient = new HttpClient(manager); // 創(chuàng)建調(diào)用對(duì)象 Call call = new Call(); call.setTargetEndpointAddress(new URL("http://localhost:8080/axis/HelloWorldService")); // 設(shè)置發(fā)送內(nèi)容格式為JSON call.addHeader("Content-Type", "application/json"); // 創(chuàng)建需要發(fā)送的JSON對(duì)象 JSONObject json = new JSONObject(); json.put("name", "Tom"); json.put("age", 18); // 發(fā)送JSON數(shù)據(jù) StringWriter sw = new StringWriter(); json.write(sw); String jsonStr = sw.toString(); String respStr = (String)call.invoke(new Object[]{jsonStr}); // 解析返回結(jié)果為JSON對(duì)象 JSONParser parser = new JSONParser(); JSONObject respJson = (JSONObject)parser.parse(respStr); System.out.println(respJson.get("message"));
如上所示,我們首先創(chuàng)建了一個(gè)HTTP發(fā)送器,為其設(shè)置了最大連接數(shù)和每個(gè)host的默認(rèn)最大連接數(shù)。然后創(chuàng)建了一個(gè)HttpClient,它將使用該發(fā)送器來(lái)發(fā)送HTTP請(qǐng)求。接著,我們創(chuàng)建了一個(gè)調(diào)用對(duì)象,設(shè)置調(diào)用的目標(biāo)地址為HelloWorldService Web服務(wù)的地址,并將發(fā)送內(nèi)容格式設(shè)置為JSON格式。隨后,我們創(chuàng)建了一個(gè)需要發(fā)送的JSON對(duì)象,并將其轉(zhuǎn)換為字符串。最后,我們調(diào)用call.invoke方法,發(fā)送JSON數(shù)據(jù),并接收響應(yīng)結(jié)果;解析返回的結(jié)果也是使用JSON對(duì)象。
通過(guò)以上方法,我們可以較為方便地在Axis1中實(shí)現(xiàn)使用JSON作為數(shù)據(jù)交換格式的Web服務(wù)。