国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

實現一個spring webservice服務端四:服務端、客戶端以及httpclient調用spr

oneasp / 2605人閱讀

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

經過前段時間的學習,已經實現一個有返回值的spring-ws服務,那接下來,就要試試能不能通過不同方式的調用,要實現一下幾種方式的測試:

spring-ws服務端測試

spring-ws客戶端測試

httpclient

spring-ws服務端測試

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

@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
        

執行測試方法,一直報下面這個錯誤:

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


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

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

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

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

Payload: 中華田園犬5

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

中華田園犬5

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

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

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

spring-ws客戶端測試

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

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





 

 


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

SaajSoapMessageFactory ------saaj 支持多

AxiomSoapMessageFactory ------axis2 適合數據多

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

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();
        }
    
        
        
    }
    
}

代碼中并沒有設置messageFactory,于是我去看源碼,發現:

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 提供了很多中構造方法,無參構造方法會加載默認的配置(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),這些方法的參數請求參數頂級接口Source ,返回數據頂級接口Result,回調方法等;只要根據接口要求,實現子類,放進方法里執行即可。
執行結果如下:

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

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

下面是我寫的測試代碼:

    @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
    

測試結果返回值如下:


    
    
        
            中華田園犬
            5
        
    

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

總結

總體而言,測試實現要比服務端實現要簡單一些,基本都很快調通了。

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

客戶端測試源碼在這里

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/70168.html

相關文章

  • WebService就是這么簡單

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

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

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

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

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

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

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

    0xE7A38A 評論0 收藏0
  • Java系統WebServiceSpring與CXF的集成

    摘要:我們再使用這樣的來查看這個服務具體的定義這個用以通過查看服務也就是我們開頭所說的用通用格式來描述的功能入參和返回值,使我們的調用者明白服務的使用方法具體詳情可以查看我們的這個服務的頁面。 WebService是什么呢?顧名思義,是Web系統提供的服務,其目的呢,往大了說:是系統實現多異構模塊協同合作,服務實現SOA(Services oriented Architecture面向服務的...

    waterc 評論0 收藏0

發表評論

0條評論

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