精华内容
下载资源
问答
  • - 使用soap协议进行ws请求时,服务端超时返回,无响应 2. WSDL 生成的wsdl如下 Service ( TreeNodeInfoProviderService ) tns= "urn:TreeNodeInfoProviderwsdl" Prefixes ( 1 ) ns0 = ...

    主要内容:

    1. 问题说明

    2. WSDL

    3. Python测试脚本

    4. 测试结果

    5. 总结

    1. 问题说明

    soap请求方法getPosterityNodes时出现504错误。

    504错误是什么
    - 使用soap协议进行ws请求时,服务端超时返回,无响应

    2. WSDL

    生成的wsdl如下

    Service ( TreeNodeInfoProviderService ) tns="urn:TreeNodeInfoProviderwsdl"
       Prefixes (1)
          ns0 = "http://schemas.xmlsoap.org/soap/encoding/"
       Ports (1):
          (TreeNodeInfoProviderPort)
             Methods (55):
                getAncestorNodeIds(xs:int nodeId, xs:int withZero, xs:int withSelf)
                getAncestorNodes(xs:int nodeId, xs:int withZero, xs:int withSelf)
                getBudgetRelatedNodeIdsById(xs:int nodeId)
                getBudgetRelatedNodeIdsByPath(xs:string path)
                getBudgetRelatedNodesById(xs:int nodeId)
                getBudgetRelatedNodesByPath(xs:string path)
                getChildrenNodeIds(xs:int nodeId)
                getChildrenNodeIdsByUserId(xs:int nodeId, xs:int userId, xs:string funcName)
                getChildrenNodes(xs:int nodeId)
                getChildrenNodesByUserId(xs:int nodeId, xs:int userId, xs:string funcName)
                getDepartmentNodeByNodeId(xs:int nodeId)
                getDepartments()
                getNodeById(xs:int nodeId)
                getNodeByPath(xs:int treeId, xs:string path)
                getNodeIdByPath(xs:int treeId, xs:string path)
                getNodeIdsByName(xs:string name)
                getNodeIdsByPartName(xs:string name)
                getNodeIdsByPartPath(xs:string name)
                getNodeIdsByProductLineId(xs:int productLineId)
                getNodeIdsByTagType(xs:string tagType)
                getNodeIdsByTagTypeName(xs:string tagType, xs:string tagName)
                getNodeIdsByTreeIdPartPath(xs:int treeId, xs:string name)
                getNodeIdsByTreeIdProductLineName(xs:int treeId, xs:string productLineName)
                getNodePathById(xs:int nodeId)
                getNodePathsByIds(ns0:Array nodeIds)
                getNodesByName(xs:string name)
                getNodesByPartName(xs:string name)
                getNodesByPartPath(xs:string name)
                getNodesByProductLineId(xs:int productLineId)
                getNodesByProductLineName(xs:string productLineName)
                getNodesByTagTypeName(xs:string tagType, xs:string tagName)
                getNodesByTreeIdPartPath(xs:int treeId, xs:string name)
                getNumPathByNodeId(xs:int nodeId)
                getPosterityNodeIds(xs:int nodeId, xs:int withSelf)
                getPosterityNodeIdsByProductLineId(xs:int productLineId)
                getPosterityNodeIdsByProductLineName(xs:string name)
                getPosterityNodeIdsByUserId(xs:int nodeId, xs:int userId, xs:int withSelf, xs:string funcName)
                getPosterityNodes(xs:int nodeId, xs:int withSelf)
                getPosterityNodesByProductLineId(xs:int productLineId)
                getPosterityNodesByProductLineName(xs:string name)
                getPosterityNodesByUserId(xs:int nodeId, xs:int userId, xs:int withSelf, xs:string funcName)
                getProductLineById(xs:int productLineId)
                getProductLineByName(xs:string name)
                getProductLineNodeByNodeId(xs:int nodeId)
                getProductLineNodes()
                getProductLines()
                getSpecialTreeNodeFullInfoByNodeid(xs:int nodeId, xs:int userId)
                getSpecialTreeNodeInfo(xs:int nodeId)
                getSpecialTreeNodeInfoByNodeid(xs:int nodeId, xs:int userId)
                getTagNamesByTagType(xs:string tagType)
                getTagTypeNameHash()
                getTagTypes()
                proxyCall(xs:string rMethod, xs:string rParamList)
                suggestNodePaths(xs:int treeId, xs:string token, xs:int limit)
                suggestNodePathsByUserId(xs:int treeId, xs:string token, xs:int limit, xs:int userId)
             Types (48):
                ns0:Array
                ns0:ENTITIES
                ns0:ENTITY
                ns0:ID
                ns0:IDREF
                ns0:IDREFS
                ns0:NCName
                ns0:NMTOKEN
                ns0:NMTOKENS
                ns0:NOTATION
                ns0:Name
                ns0:QName
                ns0:Struct
                ns0:anyURI
                ns0:arrayCoordinate
                ns0:base64
                ns0:base64Binary
                ns0:boolean
                ns0:byte
                ns0:date
                ns0:dateTime
                ns0:decimal
                ns0:double
                ns0:duration
                ns0:float
                ns0:gDay
                ns0:gMonth
                ns0:gMonthDay
                ns0:gYear
                ns0:gYearMonth
                ns0:hexBinary
                ns0:int
                ns0:integer
                ns0:language
                ns0:long
                ns0:negativeInteger
                ns0:nonNegativeInteger
                ns0:nonPositiveInteger
                ns0:normalizedString
                ns0:positiveInteger
                ns0:short
                ns0:string
                ns0:time
                ns0:token
                ns0:unsignedByte
                ns0:unsignedInt
                ns0:unsignedLong
                ns0:unsignedShort 

    3. Python测试脚本

    使用Python进行soap请求,观察结果,测试脚本如下

    from suds.client import  Client
    from suds.xsd.doctor import ImportDoctor, Import
    from suds.wsse import *
    import datetime
    url = 'http://st01-noah-matrix86.st01:8810/olive/index.php?r=Tree/infoWS/ws'
    doctor = ImportDoctor(imp)
    client = Client(url, doctor = doctor)
    security = Security()
    token = UsernameToken('admin', 'admin')
    security.tokens.append(token)
    client.set_options(wsse=security)
    print(client)                           #打印输出ws提供的接口描述信息(wsdl)
    starttime = datetime.datetime.now()
    re = client.service.getNodeById(18)   #调用ws方法getNodeById(int)
    re = client.service.getNodePathById()   #调用ws方法getNodePathById(int)
    re = client.service.getPosterityNodeIds(18,1)   #调用ws方法getPosterityNodeIds(int,int),获取指定节点的所有孩子节点的id
    re = client.service.getPosterityNodes(22,1)     #调用ws方法getPosterityNodes(int,int),获取指定节点的所有孩子节点详细信息
    print("获取的节点内容:",re)    
    endtime = datetime.datetime.now()
    print ("运行时间:",(endtime - starttime).seconds) #输出调用方法运行时间

    4. 测试结果

    参数:nodeId=0时,可以正常返回。

    调用方法返回结果运行时间
    getNodeByIdroot节点0
    getPosterityNodeIds480759个孩子节点119
    getPosterityNodesNone7

    参数:nodeId=1时,可以正常返回。

    调用方法返回结果运行时间
    getNodeByIdBAIDU节点0
    getPosterityNodeIds476727个孩子节点131
    getPosterityNodesNone7

    参数:nodeId=3时,504错误出现。

    调用方法返回结果运行时间
    getNodeByIdBAIDU_PS_www(产品线节点)0
    getPosterityNodeIds61720个孩子节点18
    getPosterityNodes无返回504错误

    参数:nodeId=22时,可以正常返回。

    调用方法返回结果运行时间
    getNodeByIdBAIDU_PS_www_online_rs_build_rs-build-rscompact.www.all(叶子节点)0
    getPosterityNodeIds1个孩子节点(包括自己)0
    getPosterityNodes可以正常返回自身的详细信息0

    参数:nodeId=18时,可以正常返回。

    调用方法返回结果运行时间
    getNodeByIdBAIDU_PS_www_online_rs_build(服务节点)0
    getPosterityNodeIds[18, 12055, 22, 23, 24, 200118829]共6个节点0
    getPosterityNodes可以正常返回6个节点的详细信息0

    5. 总结

    • root节点和BAIDU公司节点在获取孩子节点的详细信息时可以正常返回,但是返回为None
    • 测试节点id = 3,该节点是一产品线节点,下面有60000多孩子节点,获取所有孩子节点id耗时18s,获取所有孩子节点详细信息时,出现504错误
    • 其余测试节点,18和22,下面的孩子节点个数比较少,都可以按时正常返回结果,并且结果符合预期

    故:产生504错误的原因可能是大量查询操作耗时太久导致ws服务端未能按时返回结果导致504错误。

    展开全文
  • HttpClient 发送soap 请求方法

    千次阅读 2019-05-23 13:41:27
    import java.io.IOException; import java.util.... logger.error("发送http请求失败,错误信息是{}",e); throw new RuntimeException(e); } finally { closeHttpClient(response); } } }  
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    
    import org.apache.commons.lang3.StringUtils;
    import org.apache.http.HttpEntity;
    import org.apache.http.NameValuePair;
    import org.apache.http.client.config.RequestConfig;
    import org.apache.http.client.entity.UrlEncodedFormEntity;
    import org.apache.http.client.methods.CloseableHttpResponse;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.entity.StringEntity;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.impl.client.HttpClientBuilder;
    import org.apache.http.message.BasicNameValuePair;
    import org.apache.http.util.EntityUtils;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.JSONObject;
    
    
    public class HttpUtil {
    	private static ThreadLocal<CloseableHttpClient> httpClientContainer = new ThreadLocal<CloseableHttpClient>();
    
    	private static final String CHARSET = "UTF-8";
    	
    	public static final String CONTENT_TYPE_XML = "application/xml";
    	
    	public static final String CONTENT_TYPE_JSON = "application/json";
    	
    	public static final int CONNECT_TIMEOUT_NORMAL = 30000;
    	
    	public static final int SOCKET_TIMEOUT_NORMAL = 30000;
    	
    	public static final int CONNECT_TIMEOUT_MAX = 120000;
    	
    	public static final int SOCKET_TIMEOUT_MAX = 120000;
    
    	public static Logger logger = LoggerFactory.getLogger(HttpUtil.class);
    
    public static String postSoapRequest(String soapUrl,String xmlDate) {
    		logger.info("url:" + soapUrl);
    		logger.info("params:" + xmlDate);
    
    		if (StringUtils.isBlank(soapUrl)) {
    			return null;
    		}
    		CloseableHttpClient httpClient = null;
    		httpClient = getHttpClientNormal();
    		
    		CloseableHttpResponse response = null;
    		try {
    			HttpPost httpPost = new HttpPost(soapUrl);
    			httpPost.setHeader("Content-Type", "text/xml;charset=UTF-8");
    			StringEntity s = new StringEntity(xmlDate);
    			s.setContentEncoding(CHARSET);
    			s.setContentType(CONTENT_TYPE_XML);
    			httpPost.setEntity(s);
    			// 如果有请求头参数,添加进header中
    //			if (null != header && !header.isEmpty()) {
    //				for (String key : header.keySet()) {
    //					httpPost.addHeader(key, header.get(key));
    //				}
    //			}
    			response = httpClient.execute(httpPost);
    			int statusCode = response.getStatusLine().getStatusCode();
    			if (statusCode != 200) {
    				httpPost.abort();
    				throw new RuntimeException("HttpClient,error status code :" + statusCode);
    			}
    			HttpEntity entity = response.getEntity();
    			String result = null;
    			if (entity != null) {
    				result = EntityUtils.toString(entity, CHARSET);
    			}
    			logger.info("result:" + result);
    			EntityUtils.consume(entity);
    			return result;
    		} catch (Exception e) {
    			logger.error("发送http请求失败,错误信息是{}",e);
    			throw new RuntimeException(e);
    		} finally {
    			closeHttpClient(response);
    		}
    
    	}
    }

     

    展开全文
  • <p>I checked <code>default_socket_timeout</code> on the server and increased it.I also tried <code>base64_econde</code> the string, but SOAP is already encoding it by itself. <p>My code: <pre><code>...
  • //查询失败 } } // 调用WS private static StringBuffer testWebService (String sid, String content, String tranSeq, String tranReqDate) throws Exception { //拼接请求报文 String sendMsg...

    这里写图片描述

    记录测试代码

    SoapUI调用路径

    http://localhost:8082/*/webservices/**Service?wsdl
    import org.apache.commons.lang.StringUtils;
    import org.dom4j.Document;
    import org.dom4j.DocumentException;
    import org.dom4j.DocumentHelper;
    import org.dom4j.Element;
    import org.dom4j.xpath.DefaultXPath;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.util.Base64;
    import java.util.Collections;
    import java.util.List;
    
    /**
     * 模拟soapUI调用WebService,解析返回报文
     * Created by PengHongfu 2018-04-26 15:36
     */
    public class TestSoap {
    
        //测试环境地址
        public static String INVOICE_WS_URL = "http://localhost:8082/*/webservices/**Service";
    
        public static void main(String[] args) throws Exception {
    
            String sid = "SID值";
            String content = "报文内容,jOSN格式";
            String tranSeq = "UUID";
            String tranReqDate = "2018-04-24";
            StringBuffer stringBuffer = testWebService(sid, content, tranSeq, tranReqDate);
    
            // 打印HTTP响应数据
            System.out.println(stringBuffer);
    
            //处理返回数据
            String xmlResult = stringBuffer.toString().replace("&lt;", "<");
            String rtnCode = getXmlMessageByName(xmlResult, "rtnCode");//报文返回状态码,0表示正常,3表示错误
            String message = getXmlMessageByName(xmlResult, "message");//返回信息,主要是状态码不正常时抛出
            String body = getXmlMessageByName(xmlResult, "body");//返回正文数据,需要base64解密
            if ("0".equals(rtnCode)) {
                //查询成功
                if (StringUtils.isNotBlank(body)) {
                    //解密base64加密数据
                    Base64.Decoder decoder = Base64.getDecoder();
                    byte[] encodedText = body.getBytes();
                    String decrypt = new String(decoder.decode(encodedText), "UTF-8");
                    System.out.println(decrypt);
                }
            } else {
                //查询失败
            }
        }
    
        // 调用WS
        private static StringBuffer testWebService(String sid, String content, String tranSeq, String tranReqDate) throws Exception {
            //拼接请求报文
            String sendMsg = appendXmlContext(sid, content, tranSeq, tranReqDate);
            // 开启HTTP连接ַ
            InputStreamReader isr = null;
            BufferedReader inReader = null;
            StringBuffer result = null;
            OutputStream outObject = null;
            try {
                URL url = new URL(INVOICE_WS_URL);
                HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
    
                // 设置HTTP请求相关信息
                httpConn.setRequestProperty("Content-Length",
                        String.valueOf(sendMsg.getBytes().length));
                httpConn.setRequestProperty("Content-Type", "text/xml; charset=utf-8");
                httpConn.setRequestMethod("POST");
                httpConn.setDoOutput(true);
                httpConn.setDoInput(true);
    
                // 进行HTTP请求
                outObject = httpConn.getOutputStream();
                outObject.write(sendMsg.getBytes());
    
                if (200 != (httpConn.getResponseCode())) {
                    throw new Exception("HTTP Request is not success, Response code is " + httpConn.getResponseCode());
                }
                // 获取HTTP响应数据
                isr = new InputStreamReader(
                        httpConn.getInputStream(), "utf-8");
                inReader = new BufferedReader(isr);
                result = new StringBuffer();
                String inputLine;
                while ((inputLine = inReader.readLine()) != null) {
                    result.append(inputLine);
                }
                return result;
    
            } catch (IOException e) {
                throw e;
            } finally {
                // 关闭输入流
                if (inReader != null) {
                    inReader.close();
                }
                if (isr != null) {
                    isr.close();
                }
                // 关闭输出流
                if (outObject != null) {
                    outObject.close();
                }
            }
    
        }
    
        //拼接请求报文
        private static String appendXmlContext(String sid, String content, String tranSeq, String tranReqDate) {
            // 构建请求报文
    
            StringBuffer stringBuffer = new StringBuffer("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
                    "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:com=\"http://com.foresee.top.service/\">\n" +
                    "  <soapenv:Body>\n" +
                    "    <ns1:doService xmlns:ns1=\"http://cn.gov.chinatax.gt3nf.nfzcpt.service/\">\n" +
                    "      <reqXml><![CDATA[<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
                    "<tiripPackage xmlns:xsi=\"http://www.w3.org/2001/XMLSchema\" version=\"1.0\" xsi:type=\"tiripPackage\">\n" +
                    "  <sessionId/>\n" +
                    "  <service>\n" +
                    "    <sid>" + sid + "</sid>\n" +         
                    "    <version>1.0</version>\n" +
                    "    <tranSeq>+" + tranSeq + "</tranSeq>\n" +
                    "    <tranReqDate>" + tranReqDate + "</tranReqDate>\n" +
                    "  </service>\n" +
                    "  <bizContent>\n" +
                    "    <content>" + content + "</content>\n" +
                    "    <paramList>\n" +
                    "      <param>\n" +
                    "        <name>docType</name>\n" +
                    "        <value>json</value>\n" +
                    "      </param>\n" +
                    "      <param>\n" +
                    "        <name>className</name>\n" +
                    "        <value>GGG</value>\n" +
                    "      </param>\n" +
                    "    </paramList>\n" +
                    "  </bizContent>\n" +
                    "</tiripPackage>\n" +
                    "]]></reqXml>\n" +
                    "    </ns1:doService>\n" +
                    "  </soapenv:Body>\n" +
                    "</soapenv:Envelope>");
            return stringBuffer.toString();
        }
    
        //解析报文,根据末节点名称获取值
        private static String getXmlMessageByName(String xmlResult, String nodeName) throws DocumentException {
            Document doc = DocumentHelper.parseText(xmlResult);
            DefaultXPath xPath = new DefaultXPath("//" + nodeName);
            xPath.setNamespaceURIs(Collections.singletonMap("ns1", "http://cn.gov.chinatax.gt3nf.nfzcpt.service/"));
            List list = xPath.selectNodes(doc);
            if (!list.isEmpty() && list.size() > 0) {
                Element node = (Element) list.get(0);
                return node.getText();
            }
            return "";
        }
    }
    

    针对下面的报文格式,取节点值:

    <?xml version="1.0" encoding="utf-8"?>
    
    <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">  
      <soap:Body> 
        <ns1:doServiceResponse xmlns:ns1="http://cn.gov.chinatax.gt3nf.nfzcpt.service/">  
          <return><![CDATA[<taxML><service><sid>SID值</sid><channelType>10</channelType><version>1.0</version><tranSeq>UUID</tranSeq><tranReqDate>20171204</tranReqDate></service><bizContent><bizResult><head><rtnCode>0</rtnCode><rtnMsg><code>000</code><message>处理成功</message><reason></reason></rtnMsg></head><body>PFJFU1BPTlNFX0NPT1k+(BASE64加密后的数据)</body></bizResult></bizContent><returnState><returnCode>00000</returnCode><returnMessage>Success!</returnMessage></returnState></taxML>]]></return> 
        </ns1:doServiceResponse> 
      </soap:Body> 
    </soap:Envelope>
    
    展开全文
  • WebService是SOA的一种实现方式,本文将用发送邮件这个服务来展示一下WebService是如何工作的。 2.WebService就是提供服务的网络API,它给你提供服务的结构,调用方只需要负责调用服务即可。这里其实就涉及到了一些...

    1.SOA(面向服务的架构)架构模式现在十分的流行。WebService是SOA的一种实现方式,本文将用发送邮件这个服务来展示一下WebService是如何工作的。

    2.WebService就是提供服务的网络API,它给你提供服务的结构,调用方只需要负责调用服务即可。这里其实就涉及到了一些问题,首先是如何调用?服务肯定是运行在服务器上的,要想远程调用服务器上的服务就需要和服务器通信,和服务器通信就需要通信协议,比如大名鼎鼎的TCP协议。以及封装了它的上层HTTP协议等等。SOAP协议和REST协议就是两种在实现WebService的通信协议,有了这个协议,服务器会把自己的提供的服务的配置信息写到这个协议里,客户端的调用解析这个协议然后调用即可。

    3.首先是SOAP协议。这个协议看上去有点复杂:首先给出整个Demo的项目结构:

                                                  

    这里服务和客户端写在了一起,无所谓了,反正知识Demo,客服端和服务器的分离也是分分种的事情,懒得每次都要切屏了。

    首先,是提供服务的类:mailService.这个类提供了发送邮件的服务:

                                                 

    具体看一下实现:

                             

    比如sendEmail这个函数,传入地址和内容,然后调用邮件发送工具的发送函数,发送邮件。注意这里的格式,首先是@WebService这个注解,表明这里的类是即将被发布成WebService类,类中要提供服务的函数,需要注解为@WebMethod。

    其他三个函数类似。(啥,邮箱工具的发送函数是怎么写的?,后边会统一发出来,这个不是重点,服务的实现方式并不是重点,重点是我们怎么实现服务的发布和调用)。

    然后服务写好了之后,很重要,怎么发布?

    import javax.jws.WebService;
    import javax.xml.ws.Endpoint;
    @WebService
    public class PublishServer {
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		String url="http://localhost:9090/Service/mailService";
    		Endpoint.publish(url,new mailService());
    		System.out.print("public Success");
    	}
    }

    调用Endpoint的发布函数,把服务发送到固定的端口。当然了,这里可以直接启动Tomcat,把服务丢进Tomcat内,Tomcat启动的时候就会自动的把服务给发布了。

        发布完成以后,服务端会有一个.WSDL的文件。叫做WebService描述文档,这个就是基于SOAP协议的文档,怎么看这个文档呢?启动服务(我这里直接启动主函数就行,如果是在Tomcat内,就启动tomcat),然后到发布的端口上去看:

    注意看一下地址栏的网址,就是服务所在的地址+?WSDL,意思就是请求WSDL,这是一个基于get方法的请求方法,不多说了。可以看到这个WSDL文档,这是WebService的核心。这个文档内描述了这个服务的所有信息,客户端正是由于知道了这些信息才能正确的实现调用。

          那么客户端如何调用呢?首先需要生成客户端,生成客户端其实就是在解析这个WSDL文档,根据这个文档在客户端建立服务端服务的视图,通过这个视图来调用。解析WSDL文档有很多种方式,这里提供一个简单的,打开cmd输入:

     wsimport -s D:\DataBase\AWSTestEclipse\WebServiceProject\src -p mailClient -keep http://localhost:9090/Service/mailService?wsdl
    

    解释一下,-s后的就是这个项目src所在的文件夹,-p后是目标代码生成的包名,-keep就是WSDL文档的地址,然后刷新一下文件目录结构。

                                         

    就生成了这些东西。这是怎么实现的?其实是JDK里面有一个专门解析WSDL文档的JAR包。具体叫啥好像就是wsiport.jar.有了这个,就可以尽情的调用了。

          客户端的调用我写了两种方式,由于懒只介绍一种吧。采用JSP+Servlet的调用。JSP前端传回信息,后端接受信息调用服务。

                         

    核心代码:由于在客户端我们有了服务器的视图,就相当于把服务端的代码给重现了,然后直接new对应的类,调用对应的方法提供服务。完事了,好像很简单。其实这里的底层实现我想了一下,大胆猜测,就是JAVA的RMI,简直和远程方法调用一摸一样。所以软件的发展好像就是再不断重复?????

         然后SOAP就说完了。然后是REST。

         REST可能就是JAVA注解的应用吧(啥叫注解???随便理解一下就是注入并解释,JAVA的动态注入大名鼎鼎,这也算是一个应用吧)

         正题:

    还是看一下Demo的目录结构:

                                           

        还是用REST实现一个邮件发送服务:首先需要一些外部JAR包。

                                         

    这个文件夹我后边会上传打github,当然自己下也可以。把里面的所有的jar包导入成外部jar包,并且在WEB-INF/lib复制一份

                                          

    为啥要复制到lib下因为汤姆猫启动的时候,只会加载lib下的外部jar包,所以以后遇到tomcat报错无法找到XX类,就去把包复制进就完事了。

    然后继续写服务类:

    hai还是刚才的sendEmail函数,这里有几个很重要的注解,首先是最上面的@Path("/SendService")注解,这里其实就是在定义这个类的路径。然后函数上的三个注解,@GET指的是网络请求方法,@Path()定义了这个函数相对于类的路径,最后一个Prodeces我也没仔细看。函数参数的注解,额,没啥好说的,很normal,就是动态注入时候用的。

    最后写一下配置文件,这个很重要,但是格式几乎就是固定的:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
      <display-name>CalculatorREST</display-name>
      <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
      </welcome-file-list>
      <servlet>
        <servlet-name>Jersey RESTful Application</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
          <param-name>jersey.config.server.provider.packages</param-name>
          <param-value>mypackage</param-value>
        </init-param>
      </servlet>
      <servlet-mapping>
        <servlet-name>Jersey RESTful Application</servlet-name>
        <url-pattern>/rest/*</url-pattern>
      </servlet-mapping>
      <servlet>
        <servlet-name>HandleQuery</servlet-name>
        <servlet-class>test.HandEmail</servlet-class>
      </servlet>
      <servlet-mapping>
        <servlet-name>HandleQuery</servlet-name>
        <url-pattern>/test1</url-pattern>
      </servlet-mapping>
      
      
      
    </web-app>

    除去我得Servlet(HandleQuery)的配置,上边的都是这个服务的配置,其实大多都不变,只需要配置一下包名:

                     

    服务写完,直接在项目名上右键,run起来,tomcat启动。

             客户端如何调用?其实很简单,REST之所以使用@Path注解一直在注解路径,就是为了向外部暴露自己方法的路径,只要是沿着路径找到它,然后再把参数给注入进去就完事了。Tomcat通过反射注入参数,实现调用。比如服务器启动之后,直接再浏览器输入:http://localhost:8080/TestRest/rest/SendService/sendEmail?url=1356931781@qq.com&payload=test

     

    解析一下这个地址:首先TestRest是项目名,rest表明我们用rest协议,SendService呢?

    再看一下这张图,我们把类注解为SendService,所以他会找到这个类,后边的也是一样的,找到sendEmail这个方法,然后把参数注入。完成调用。

    常见问题:

    (1)javax.email找不到?哥哥你要导入啊!!!!!,官网下一个??

    (2)SOAP协议发布的时候,显示areadyBind???之类的,如果你已经run了一次了,这个端口就被bind了,解决方案:换一个或者从起

    (3)SOAP协议是@WebSevice之类的注解失败??该注解的地方注解一下。。。。。别偷懒

    (4)REST协议web.xml配置文件总是出错???复制我上边哪个,别瞎改。。。。

    (5)REST协议时,注意把javax.email也给加到lib里

    github地址:https://github.com/wsyingang/SA/tree/master/SendEmail

    展开全文
  • 通过 HttpClient 及 HttpURLConnection 发送SOAP请求,代码如下: public String remoteGetDate(String endpoint,String starttime,String endtime) throws HttpException, IOException { int timeout = 60000 ...
  • } /** * 发送SOAP消息,使用默认的http请求设置 * @param url * @param soapXml * @param soapAction * @param userpass * @param contentType * @return */ public static String doPostSoapByDefaultHttpSetting...
  • 1、最好用工具根据wsdl生成接口规范文件,这样接口的定义包括namespace等都处理了 2、请求时遇到错误: org.apache.cxf.interceptor.Fault: Unmarshalling Error: ... local:"strRequest")。所需元素为strRequest>,
  • soap

    2019-10-02 23:06:15
    SOAP以XML形式提供了一个简单、轻量的用于在分散或分布环境中交换结构化和类型信息的机制。SOAP本身并没有定义任何应用程序语义,如编程模型或特定语义的实现;实际上它通过提供一个有标准组件的包模型和在模块中...
  • 使用原生的SoapClient库请求也是失败。只好用post来进行模拟了。代码贴出来,给大家参考一下。 <?php namespace App\Services\Proxy; use Log; use Cache; class Crm { private $host; ...
  • Springboot与Soap协议交互(一)Client篇

    千次阅读 2020-04-10 01:24:05
    Springboot与Soap协议交互(一)Client篇前言测试的Soap接口使用jdk自带工具wsimport生成相关java类pom.xml相关依赖配置创建配置类创建测试方法启动项目,在浏览器调Springboot接口去获取Soap服务并打印返回值总结 ...
  • SOAP协议和基于SOAP的开发流程详述

    万次阅读 2015-09-10 18:45:33
    简单对象访问协议(SOAP)是交换数据的一种协议规范,是一种轻量的、简单的、基于XML的协议,它被设计成在WEB上交换结构化的和固化的信息。 在实际的软件开发项目中,SOAP大多用于处理用户数据,也即实现开户、销户、...
  • 接口测试

    千次阅读 多人点赞 2019-10-12 13:49:16
    而WebService则类似于bs架构,只需要开发服务器端,不需要开发客户端,客户端只要遵循soap协议,就可以调用 接口测试如何开展? 按照测试计划从wiki上获取接口文档,开始着手接口测试工作,测试用例的编写和执行...
  • JAVA调用webService SOAP12

    千次阅读 2018-09-18 11:37:43
     System.out.println("调用失败!错误码:" + statusCode);  }    }   }     接口原页   WANDAService   单击 此处 ,获取完整的操作列表。 GetTax 餐商逾期 测试 ...
  • Android soap请求和解析

    千次阅读 2015-08-31 16:15:52
    1,soap请求try { LogUtil.d(TAG, "url:"+SDKConfig.BaseUrl+",nameSpace:"+nameSpace+",methodName:"+methodName+",params:"+params.toString()); // 第一:实例化S
  • WPF学习

    万次阅读 多人点赞 2019-03-05 22:00:17
    首先感谢刘铁锰先生的《深入浅出WPF》,学习WPF过程碰上很多新概念,如Data Binding、路由事件,命令、各种模板等。 WPF:编写CS端的UI技术。 怎么去掉WPF窗体靠上多出黑色的长条?...(我自己觉得偶尔会用用这个) ...
  • C#基础教程-c#实例教程,适合初学者

    万次阅读 多人点赞 2016-08-22 11:13:24
    C#基础教程-c#实例教程,适合初学者。 第一章 C#语言基础 本章介绍C#语言的基础知识,希望具有C语言的读者能够基本掌握C#语言,并以此为基础,能够进一步学习用C#语言编写window应用程序和Web应用程序。...
  • 短信网关post-get-soap请求方式发送验证码 (兼容各个短信平台方案) 1、短信网关配置参数: URL 接口请求路径 API 接口传入的参数(为平台所需参数拼接后的结果) smsText 接収的短信息 smsMob 接収...
  • jquery.Ajax soap方式调用webservice

    千次阅读 2017-08-24 15:24:39
    首先写出soap报文var soapdata = '';soapdata = soapdata + '';  soapdata = soapdata + ' ';  soapdata = soapdata + ' ';  soapdata = soapdata + ' <?xml version="1.0" encoding="GBK" standalone="yes...
  • 创建javabean ,RequestCommonFPKJ@XStreamAlias("REQUEST_COMMON_FPKJ") public class RequestCommonFPKJ { @XStreamAsAttribute //子元素作为标签属性出现 @XStreamAlias("...
  • 这通常是由于不正确的地址或者 SOAP 操作导致的。如果存在此情况,请参见 InnerException 以了解详细信息。解决方案: 把web.config配置文件里的http://sdk999ws.eucp.b2m.cn:8080/sdk/SDKSer...
  • SOAP协议规范

    千次阅读 2016-07-07 11:05:27
    SOAP协议规范 SOAP协议规范 1. 简介 SOAP以XML形式提供了一个简单、轻量的用于在分散或分布环境中交换结构化和类型信息的机制。SOAP本身并没有定义任何应用程序语义,如编程模型或特定语义的实现;实际上它...
  • 终于解决了PHP调用SOAP过程中的种种问题。  (2009-05-26 15:59:10) 转载▼ 标签:  php   soap   webservice   问题 分类: PHP  最近在做公司和第三方的一个...
  • WebService之Soap协议数据解析篇

    万次阅读 2016-12-04 15:43:34
    // 将获取的消息利用Handler发送到主线程 mHandler.sendMessage(mHandler.obtainMessage( 0 , resultSoapObject)); } } }); } /** * WebService的回调 * @author zhengmin * */ public ...
  • Webservice是基于SOAP协议的请求,SOAP协议是xml格式的。所以请求参数和回执全部都是xml。 获取命名空间和参数等信息 一般webservice接口只会给一个xxx.wsdl文件 如:...
  • 网络连接失败 string >   布局 view plain copy to clipboard print ? TextView    android:layout_width = "fill_parent"     android:layout_height = "wrap_content"     ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,814
精华内容 4,325
关键字:

发送soap失败