亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

實(shí)現(xiàn)一個(gè)spring webservice服務(wù)端四:服務(wù)端、客戶(hù)端以及httpclient調(diào)用spr

oneasp / 2658人閱讀

摘要:執(zhí)行結(jié)果如下中華田園犬測(cè)試我認(rèn)為所有使用協(xié)議的,都能使用測(cè)試。下面是我寫(xiě)的測(cè)試代碼旺財(cái)需要增加一個(gè)包測(cè)試結(jié)果返回值如下中華田園犬寫(xiě)法稍微有點(diǎn)麻煩的是,需要拼接請(qǐng)求參數(shù),參數(shù)少的話還好,多的話就很煩不過(guò)這種方法不用生成一大堆客戶(hù)端代碼。

經(jīng)過(guò)前段時(shí)間的學(xué)習(xí),已經(jīng)實(shí)現(xiàn)一個(gè)有返回值的spring-ws服務(wù),那接下來(lái),就要試試能不能通過(guò)不同方式的調(diào)用,要實(shí)現(xiàn)一下幾種方式的測(cè)試:

spring-ws服務(wù)端測(cè)試

spring-ws客戶(hù)端測(cè)試

httpclient

spring-ws服務(wù)端測(cè)試

我對(duì)spring-test 和spring-ws-test,幾乎沒(méi)有什么了解,只好按照文檔來(lái)寫(xiě)spring-ws服務(wù)端測(cè)試的,這是測(cè)試代碼:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("spring-ws-servlet.xml")
public class WebserviceTest {
    
    @Autowired
    private ApplicationContext applicationContext;
    
    private MockWebServiceClient client;
    
    @Before
    public void createClient() {
        client = MockWebServiceClient.createClient(applicationContext);
    }
    
    
    @Test
    public void holidayTest() {
    
        Source requestPayload = new StringSource(
            
                "" +
                    
                        "旺財(cái)" +
                    
                        "");
    
        Source responsePayload = new StringSource(
            
                "" +
                        "中華田園犬" +
                        "5" +
                       "");
    
    
        client.sendRequest(RequestCreators.withPayload(requestPayload)).andExpect(ResponseMatchers
                .payload
                (responsePayload));
        
    }
}

需要添加jar包:

        
            junit
            junit
            4.12
        
        
            org.springframework.ws
            spring-ws-test
            2.4.0.RELEASE
        
        
            org.springframework
            spring-test
            4.2.7.RELEASE
        

執(zhí)行測(cè)試方法,一直報(bào)下面這個(gè)錯(cuò)誤:

failed to load applicationcontext

因?yàn)槲覜](méi)有配置日志,所以不知道具體錯(cuò)誤是什么,只好又去配置log4j2,配置完之后,具體的錯(cuò)誤信息可以看到了:

Caused by: java.io.FileNotFoundException: class path resource [spring-ws-servlet.xml] cannot be opened because it does not exist
    at org.springframework.core.io.ClassPathResource.getInputStream(ClassPathResource.java:172)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:330)
    ... 36 more

可以看到,是因?yàn)檎也坏脚渲梦募緎pring-ws-servlet.xml】,我找到了出錯(cuò)的代碼:

public URL getResource(String name) {
        URL url;
        if (parent != null) {
            url = parent.getResource(name);
        } else {
            url = getBootstrapResource(name);
        }
        if (url == null) {
            url = findResource(name);
        }
        return url;
    }

name就是spring-ws-servlet.xml, parent就是Classloader,只是不知道為什么找不到;

我只好把路徑修改為@ContextConfiguration("classpath:spring-ws-servlet.xml"),為了能夠在classpath下找到這個(gè)文件,又把spring-ws-servlet.xml 和hr.xsd文件復(fù)制到src/main/resource下面,可能有人會(huì)疑惑為什么是復(fù)制過(guò)去一份,而不是把WEB-INF下的文件轉(zhuǎn)移到src/main/resource下面,因?yàn)閟pring 的默認(rèn)加載位置就是wWEB-INF下的文件,而我又沒(méi)有找到讀取classpath路徑文件的配置,就是這個(gè):


    spring-ws
    org.springframework.ws.transport.http.MessageDispatcherServlet
    
      transformWsdlLocations
      true
    
  

所以只好改成這樣,雖然看著奇怪,但是不再報(bào)找不到文件的錯(cuò)誤了。

改完之后,繼續(xù)測(cè)試,可是又有報(bào)錯(cuò)了:

[different] Expected namespace URI "http://mycompany.com/hr/webservice" but was "null" - comparing  at /holidayResponse[1] to  at /holidayResponse[1]

Payload: 中華田園犬5

起初,以為是哪里錯(cuò)了,后來(lái),認(rèn)真看了下信息,才發(fā)現(xiàn),報(bào)錯(cuò)是因?yàn)槠谕祷刂抵杏衳mlns="http://mycompany.com/hr/webse...",但是實(shí)際返回值是:

中華田園犬5

和期望的值不一樣,所以才報(bào)了這個(gè)錯(cuò),把期望值修改了一下:

Source responsePayload = new StringSource(
            
                "" +
                        "中華田園犬" +
                        "5" +
                       "");

這樣再測(cè)試,就不報(bào)錯(cuò)了。
至此,spring-ws服務(wù)端測(cè)試通過(guò)。

spring-ws客戶(hù)端測(cè)試

spring-ws參考文檔上關(guān)于服務(wù)端測(cè)試,給出了幾種方式,有http、jms、eamil等,因?yàn)槲业臏y(cè)試服務(wù)端是http的,所以就使用http的測(cè)試;

關(guān)于http測(cè)試webservice的方式,spring-ws首先給出的要求是要有消息工廠【messageFactory】,就像下面的配置一樣:





 

 


spring-ws提供了兩種消息工廠,分別為:

SaajSoapMessageFactory ------saaj 支持多

AxiomSoapMessageFactory ------axis2 適合數(shù)據(jù)多

我參考文檔寫(xiě)的測(cè)試代碼是:

import org.junit.Test;
import org.springframework.ws.client.core.WebServiceTemplate;
import org.springframework.xml.transform.StringSource;

import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

/**
 * Created by nyl
 * 2017/6/23
 */
public class SpringClient {
    
    private final WebServiceTemplate client = new WebServiceTemplate();
    
    
    @Test
    public void sptingTest() {
        
        client.setDefaultUri("http://www.ningyongli.site:8080/webservicelearn/holidayService");
    
        StreamSource source =  new StringSource(
        
                "" +
                
                        "旺財(cái)" +
                
                        "");
    
        try {
            JAXBContext unmarshaller = JAXBContext.newInstance(HolidayResponse.class);
            JAXBResult jaxbResult = new JAXBResult(unmarshaller);
            
            //StreamResult result = new StreamResult(System.out);
            client.sendSourceAndReceiveToResult(source, jaxbResult);
            HolidayResponse holidayResponse = (HolidayResponse) jaxbResult.getResult();
            System.out.println(holidayResponse.toString());
        } catch (JAXBException e) {
            e.printStackTrace();
        }
    
        
        
    }
    
}

代碼中并沒(méi)有設(shè)置messageFactory,于是我去看源碼,發(fā)現(xiàn):

public WebServiceTemplate() {
        initDefaultStrategies();
    }

    /**
     * Creates a new {@code WebServiceTemplate} based on the given message factory.
     *
     * @param messageFactory the message factory to use
     */
    public WebServiceTemplate(WebServiceMessageFactory messageFactory) {
        setMessageFactory(messageFactory);
        initDefaultStrategies();
    }

 還有···········

WebServiceTemplate 提供了很多中構(gòu)造方法,無(wú)參構(gòu)造方法會(huì)加載默認(rèn)的配置(initDefaultStrategies),默認(rèn)配置如下:

org.springframework.ws.client.core.FaultMessageResolver=org.springframework.ws.soap.client.core.SoapFaultMessageResolver
org.springframework.ws.WebServiceMessageFactory=org.springframework.ws.soap.saaj.SaajSoapMessageFactory
org.springframework.ws.transport.WebServiceMessageSender=org.springframework.ws.transport.http.HttpUrlConnectionMessageSender

也就是說(shuō),默認(rèn)的就是SaajSoapMessageFactory這個(gè),知道了,我就不管這個(gè)了。

WebServiceTemplate 有很多用于請(qǐng)求的方法

我用的是這個(gè)sendSourceAndReceiveToResult(source, result),這些方法的參數(shù)請(qǐng)求參數(shù)頂級(jí)接口Source ,返回?cái)?shù)據(jù)頂級(jí)接口Result,回調(diào)方法等;只要根據(jù)接口要求,實(shí)現(xiàn)子類(lèi),放進(jìn)方法里執(zhí)行即可。
執(zhí)行結(jié)果如下:

HolidayResponse{ name=中華田園犬, age=5}
httpclient測(cè)試

我認(rèn)為所有使用http協(xié)議的,都能使用httpclient測(cè)試。
我在學(xué)習(xí)spring-ws之前遇到了幾次webservice的問(wèn)題,其中一個(gè)讓我印象深刻,第三方公司給我一個(gè)wsdl文件,我根據(jù)文件生成客戶(hù)端代碼,發(fā)現(xiàn)返回值是boolean類(lèi)型的數(shù)據(jù),但是他給我的soap ui測(cè)試截圖上,返回的是一個(gè)復(fù)雜的對(duì)象,我以為我客戶(hù)端代碼生成錯(cuò)了,于是嘗試了axis 、axis2 、cxf等jar包,生成的返回值都一樣,于是我就去看wsdl文件(那時(shí)候基本上還看不懂),發(fā)現(xiàn)wsdl中返回值就是boolean類(lèi)型,于是和對(duì)接人員溝通希望給出正確的wsdl文件,結(jié)果對(duì)方不認(rèn)為wsdl有問(wèn)題,反正soap ui 測(cè)通了,讓我自己想辦法。
于是就有了httpclient調(diào)用webservice的經(jīng)歷。

下面是我寫(xiě)的測(cè)試代碼:

    @Test
    public void httpclientTest() {
        CloseableHttpClient closeableHttpClient = null;
        CloseableHttpResponse closeableHttpResponse = null;
        String  result = null;
        try {
            
            String requestStr = "" +
                    "" +
                    ""+
                    "" +
                    "旺財(cái)" +
                    "" +
                    "" +
                    "";
                
            HttpPost httpPost = new HttpPost("http://www.ningyongli.site:8080/webservicelearn/holidayService");
            httpPost.setHeader("Content-Type", "text/xml;charset=utf-8");
            //httpPost.setHeader("SOAPAction", "hollidayService");
    
            System.out.println(requestStr);
            StringEntity entity = new StringEntity(requestStr, "UTF-8");
            httpPost.setEntity(entity);
        
            closeableHttpClient = HttpClients.createDefault();
            closeableHttpResponse = closeableHttpClient.execute(httpPost);
            result = EntityUtils.toString(closeableHttpResponse.getEntity());
            System.out.println(result);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                closeableHttpResponse.close();
                closeableHttpClient.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

需要增加一個(gè)jar包:

   
      org.apache.httpcomponents
      httpclient
      4.5.3
    

測(cè)試結(jié)果返回值如下:


    
    
        
            中華田園犬
            5
        
    

寫(xiě)法稍微有點(diǎn)麻煩的是,需要拼接請(qǐng)求參數(shù),參數(shù)少的話還好,多的話就很煩;不過(guò)這種方法不用生成一大堆客戶(hù)端代碼。

總結(jié)

總體而言,測(cè)試實(shí)現(xiàn)要比服務(wù)端實(shí)現(xiàn)要簡(jiǎn)單一些,基本都很快調(diào)通了。

本來(lái)還想用axis、axis2調(diào)用測(cè)試一下的,但是突然發(fā)現(xiàn)spring-ws生成的wsdl路徑和它們要求的有點(diǎn)不一樣,這兩種要求路徑都是這樣的http://ip:port/name/servicena...,和我用spring-ws有點(diǎn)不一樣,嘗試了一下常用的調(diào)用方式都無(wú)法實(shí)現(xiàn)。以后對(duì)axis和axis2有一定了解了,再來(lái)看這個(gè)問(wèn)題。

客戶(hù)端測(cè)試源碼在這里

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/70168.html

相關(guān)文章

  • WebService就是這么簡(jiǎn)單

    摘要:它使用方式,接收和響應(yīng)外部系統(tǒng)的某種請(qǐng)求。回顧我們?cè)趯W(xué)習(xí)基礎(chǔ)網(wǎng)絡(luò)編程章節(jié)已經(jīng)知道了這么一個(gè)連接了。使用指定名稱(chēng)的命名空間。名詞簡(jiǎn)單對(duì)象訪問(wèn)協(xié)議作為一個(gè)基于語(yǔ)言的協(xié)議用于有網(wǎng)上傳輸數(shù)據(jù)。以的根元素出現(xiàn)。代理這么一個(gè)概念就更加清晰了。 WebService介紹 首先我們來(lái)談一下為什么需要學(xué)習(xí)webService這樣的一個(gè)技術(shù)吧.... 問(wèn)題一 如果我們的網(wǎng)站需要提供一個(gè)天氣預(yù)報(bào)這樣一個(gè)需求...

    SwordFly 評(píng)論0 收藏0
  • Java 遠(yuǎn)程通訊技術(shù)及原理分析

    摘要:對(duì)于與而言,則可以看做是消息傳遞技術(shù)的一種衍生或封裝。在生產(chǎn)者通知消費(fèi)者時(shí),傳遞的往往是消息或事件,而非生產(chǎn)者自身。通過(guò)消息路由,我們可以配置路由規(guī)則指定消息傳遞的路徑,以及指定具體的消費(fèi)者消費(fèi)對(duì)應(yīng)的生產(chǎn)者。采用和來(lái)進(jìn)行遠(yuǎn)程對(duì)象的通訊。 消息模式 歸根結(jié)底,企業(yè)應(yīng)用系統(tǒng)就是對(duì)數(shù)據(jù)的處理,而對(duì)于一個(gè)擁有多個(gè)子系統(tǒng)的企業(yè)應(yīng)用系統(tǒng)而言,它的基礎(chǔ)支撐無(wú)疑就是對(duì)消息的處理。與對(duì)象不同,消息本質(zhì)上...

    rozbo 評(píng)論0 收藏0
  • 分布式服務(wù)框架之遠(yuǎn)程通訊技術(shù)及原理分析

    摘要:微軟的雖然引入了事件機(jī)制,可以在隊(duì)列收到消息時(shí)觸發(fā)事件,通知訂閱者。由微軟作為主要貢獻(xiàn)者的,則對(duì)以及做了進(jìn)一層包裝,并能夠很好地實(shí)現(xiàn)這一模式。 在分布式服務(wù)框架中,一個(gè)最基礎(chǔ)的問(wèn)題就是遠(yuǎn)程服務(wù)是怎么通訊的,在Java領(lǐng)域中有很多可實(shí)現(xiàn)遠(yuǎn)程通訊的技術(shù),例如:RMI、MINA、ESB、Burlap、Hessian、SOAP、EJB和JMS等,這些名詞之間到底是些什么關(guān)系呢,它們背后到底是基...

    sorra 評(píng)論0 收藏0
  • 分布式服務(wù)框架之遠(yuǎn)程通訊技術(shù)及原理分析

    摘要:微軟的雖然引入了事件機(jī)制,可以在隊(duì)列收到消息時(shí)觸發(fā)事件,通知訂閱者。由微軟作為主要貢獻(xiàn)者的,則對(duì)以及做了進(jìn)一層包裝,并能夠很好地實(shí)現(xiàn)這一模式。 在分布式服務(wù)框架中,一個(gè)最基礎(chǔ)的問(wèn)題就是遠(yuǎn)程服務(wù)是怎么通訊的,在Java領(lǐng)域中有很多可實(shí)現(xiàn)遠(yuǎn)程通訊的技術(shù),例如:RMI、MINA、ESB、Burlap、Hessian、SOAP、EJB和JMS等,這些名詞之間到底是些什么關(guān)系呢,它們背后到底是基...

    0xE7A38A 評(píng)論0 收藏0
  • Java系統(tǒng)WebServiceSpring與CXF的集成

    摘要:我們?cè)偈褂眠@樣的來(lái)查看這個(gè)服務(wù)具體的定義這個(gè)用以通過(guò)查看服務(wù)也就是我們開(kāi)頭所說(shuō)的用通用格式來(lái)描述的功能入?yún)⒑头祷刂?,使我們的調(diào)用者明白服務(wù)的使用方法具體詳情可以查看我們的這個(gè)服務(wù)的頁(yè)面。 WebService是什么呢?顧名思義,是Web系統(tǒng)提供的服務(wù),其目的呢,往大了說(shuō):是系統(tǒng)實(shí)現(xiàn)多異構(gòu)模塊協(xié)同合作,服務(wù)實(shí)現(xiàn)SOA(Services oriented Architecture面向服務(wù)的...

    waterc 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<