成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

oneasp / 2607人閱讀

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

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

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

spring-ws客戶端測試

httpclient

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

我對spring-test 和spring-ws-test,幾乎沒有什么了解,只好按照文檔來寫spring-ws服務(wù)端測試的,這是測試代碼:

@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(
            
                "" +
                    
                        "旺財" +
                    
                        "");
    
        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í)行測試方法,一直報下面這個錯誤:

failed to load applicationcontext

因為我沒有配置日志,所以不知道具體錯誤是什么,只好又去配置log4j2,配置完之后,具體的錯誤信息可以看到了:

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

可以看到,是因為找不到配置文件【spring-ws-servlet.xml】,我找到了出錯的代碼:

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下找到這個文件,又把spring-ws-servlet.xml 和hr.xsd文件復(fù)制到src/main/resource下面,可能有人會疑惑為什么是復(fù)制過去一份,而不是把WEB-INF下的文件轉(zhuǎn)移到src/main/resource下面,因為spring 的默認加載位置就是wWEB-INF下的文件,而我又沒有找到讀取classpath路徑文件的配置,就是這個:


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

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

改完之后,繼續(xù)測試,可是又有報錯了:

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

Payload: 中華田園犬5

起初,以為是哪里錯了,后來,認真看了下信息,才發(fā)現(xiàn),報錯是因為期望返回值中有xmlns="http://mycompany.com/hr/webse...",但是實際返回值是:

中華田園犬5

和期望的值不一樣,所以才報了這個錯,把期望值修改了一下:

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

這樣再測試,就不報錯了。
至此,spring-ws服務(wù)端測試通過。

spring-ws客戶端測試

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

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





 

 


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

SaajSoapMessageFactory ------saaj 支持多

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

我參考文檔寫的測試代碼是:

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(
        
                "" +
                
                        "旺財" +
                
                        "");
    
        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();
        }
    
        
        
    }
    
}

代碼中并沒有設(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)造方法,無參構(gòu)造方法會加載默認的配置(initDefaultStrategies),默認配置如下:

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

也就是說,默認的就是SaajSoapMessageFactory這個,知道了,我就不管這個了。

WebServiceTemplate 有很多用于請求的方法

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

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

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

下面是我寫的測試代碼:

    @Test
    public void httpclientTest() {
        CloseableHttpClient closeableHttpClient = null;
        CloseableHttpResponse closeableHttpResponse = null;
        String  result = null;
        try {
            
            String requestStr = "" +
                    "" +
                    ""+
                    "" +
                    "旺財" +
                    "" +
                    "" +
                    "";
                
            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();
            }
        }
    }

需要增加一個jar包:

   
      org.apache.httpcomponents
      httpclient
      4.5.3
    

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


    
    
        
            中華田園犬
            5
        
    

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

總結(jié)

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

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

客戶端測試源碼在這里

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

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/70168.html

相關(guān)文章

  • WebService就是這么簡單

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

    SwordFly 評論0 收藏0
  • Java 遠程通訊技術(shù)及原理分析

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

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

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

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

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

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

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

    waterc 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<