C#/Java 调用WSDL接口及方法
一、C#利用vs里面自带的“添加web引用”功能:
1.首先需要清楚WSDL的引用地址
如:http://www.webxml.com.cn/Webservices/WeatherWebService.asmx
2.在.Net项目中,添加web引用。
3.在弹出页面中,输入URL->点击点击绿色图标(前往)按钮->自定义引用名->点击添加引用
4.添加成功,查看类中可调用的方法:
5.在项目中,调用wsdl中的方法。
- private void button1_Click(object sender, EventArgs e)
- {
- testWS2.Weather.WeatherWebService objWeather = new Weather.WeatherWebService();
- string strCityName = "上海";
- string[] arrWeather = objWeather.getWeatherbyCityName(strCityName);
- MessageBox.Show(arrWeather[10]);
- }
6.注意事项:
(1)如果看不到第四步类,点击项目上面的“显示所有文件”图标按钮;
(2)如果目标框架.NET Framework 4.0生成的第四步类无可调用的方法,可以试一下“.NET Framework 2.0”;
二、C# .Net采用GET/POST/SOAP方式动态调用WebService的简易灵活方法
参考:http://blog.csdn.net/chlyzone/article/details/8210718
这个类有三个公用的方法:QuerySoapWebService为通用的采用Soap方式调用WebService,QueryGetWebService采用GET方式调用,QueryPostWebService采用POST方式调用,后两个方法需要WebService服务器支持相应的调用方式。三个方法的参数和返回值相同:URL为Webservice的Url地址(以.asmx结尾的);MethodName为要调用的方法名称;Pars为参数表,它的Key为参数名称,Value为要传递的参数的值,Value可为任意对象,前提是这个对象可以被xml序列化。注意方法名称、参数名称、参数个数必须完全匹配才能正确调用。第一次以Soap方式调用时,因为需要查询WSDL获取xmlns,因此需要时间相对长些,第二次调用不用再读WSDL,直接从缓存读取。这三个方法的返回值均为XmlDocument对象,这个返回的对象可以进行各种灵活的操作。最常用的一个SelectSingleNode方法,可以让你一步定位到Xml的任何节点,再读取它的文本或属性。也可以直接调用Save保存到磁盘。采用Soap方式调用时,根结点名称固定为root。
这个类主要是利用了WebRequest/WebResponse来完成各种网络查询操作。为了精简明了,这个类中没有添加错误处理,需要在调用的地方设置异常捕获。
- using System;
- using System.Web;
- using System.Xml;
- using System.Collections;
- using System.Net;
- using System.Text;
- using System.IO;
- using System.Xml.Serialization;
- //By huangz 2008-3-19
- /**/
- /// <summary>
- /// 利用WebRequest/WebResponse进行WebService调用的类,By 同济黄正 http://hz932.ys168.com 2008-3-19
- /// </summary>
- public class WebSvcCaller
- {
- //<webServices>
- // <protocols>
- // <add name="HttpGet"/>
- // <add name="HttpPost"/>
- // </protocols>
- //</webServices>
- private static Hashtable _xmlNamespaces = new Hashtable();//缓存xmlNamespace,避免重复调用GetNamespace
- /**/
- /// <summary>
- /// 需要WebService支持Post调用
- /// </summary>
- public static XmlDocument QueryPostWebService(String URL, String MethodName, Hashtable Pars)
- {
- HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(URL + "/" + MethodName);
- request.Method = "POST";
- request.ContentType = "application/x-www-form-urlencoded";
- SetWebRequest(request);
- byte[] data = EncodePars(Pars);
- WriteRequestData(request, data);
- return ReadXmlResponse(request.GetResponse());
- }
- /**/
- /// <summary>
- /// 需要WebService支持Get调用
- /// </summary>
- public static XmlDocument QueryGetWebService(String URL, String MethodName, Hashtable Pars)
- {
- HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(URL + "/" + MethodName + "?" + ParsToString(Pars));
- request.Method = "GET";
- request.ContentType = "application/x-www-form-urlencoded";
- SetWebRequest(request);
- return ReadXmlResponse(request.GetResponse());
- }
- /**/
- /// <summary>
- /// 通用WebService调用(Soap),参数Pars为String类型的参数名、参数值
- /// </summary>
- public static XmlDocument QuerySoapWebService(String URL, String MethodName, Hashtable Pars)
- {
- if (_xmlNamespaces.ContainsKey(URL))
- {
- return QuerySoapWebService(URL, MethodName, Pars, _xmlNamespaces[URL].ToString());
- }
- else
- {
- return QuerySoapWebService(URL, MethodName, Pars, GetNamespace(URL));
- }
- }
- private static XmlDocument QuerySoapWebService(String URL, String MethodName, Hashtable Pars, string XmlNs)
- {
- _xmlNamespaces[URL] = XmlNs;//加入缓存,提高效率
- HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(URL);
- request.Method = "POST";
- request.ContentType = "text/xml; charset=utf-8";
- request.Headers.Add("SOAPAction", "\"" + XmlNs + (XmlNs.EndsWith("/") ? "" : "/") + MethodName + "\"");
- SetWebRequest(request);
- byte[] data = EncodeParsToSoap(Pars, XmlNs, MethodName);
- WriteRequestData(request, data);
- XmlDocument doc = new XmlDocument(), doc2 = new XmlDocument();
- doc = ReadXmlResponse(request.GetResponse());
- XmlNamespaceManager mgr = new XmlNamespaceManager(doc.NameTable);
- mgr.AddNamespace("soap", "http://schemas.xmlsoap.org/soap/envelope/");
- String RetXml = doc.SelectSingleNode("//soap:Body/*/*", mgr).InnerXml;
- doc2.LoadXml("<root>" + RetXml + "</root>");
- AddDelaration(doc2);
- return doc2;
- }
- private static string GetNamespace(String URL)
- {
- HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL + "?WSDL");
- SetWebRequest(request);
- WebResponse response = request.GetResponse();
- StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
- XmlDocument doc = new XmlDocument();
- doc.LoadXml(sr.ReadToEnd());
- sr.Close();
- return doc.SelectSingleNode("//@targetNamespace").Value;
- }
- private static byte[] EncodeParsToSoap(Hashtable Pars, String XmlNs, String MethodName)
- {
- XmlDocument doc = new XmlDocument();
- doc.LoadXml("<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"></soap:Envelope>");
- AddDelaration(doc);
- XmlElement soapBody = doc.CreateElement("soap", "Body", "http://schemas.xmlsoap.org/soap/envelope/");
- XmlElement soapMethod = doc.CreateElement(MethodName);
- soapMethod.SetAttribute("xmlns", XmlNs);
- foreach (string k in Pars.Keys)
- {
- XmlElement soapPar = doc.CreateElement(k);
- soapPar.InnerXml = ObjectToSoapXml(Pars[k]);
- soapMethod.AppendChild(soapPar);
- }
- soapBody.AppendChild(soapMethod);
- doc.DocumentElement.AppendChild(soapBody);
- return Encoding.UTF8.GetBytes(doc.OuterXml);
- }
- private static string ObjectToSoapXml(object o)
- {
- XmlSerializer mySerializer = new XmlSerializer(o.GetType());
- MemoryStream ms = new MemoryStream();
- mySerializer.Serialize(ms, o);
- XmlDocument doc = new XmlDocument();
- doc.LoadXml(Encoding.UTF8.GetString(ms.ToArray()));
- if (doc.DocumentElement != null)
- {
- return doc.DocumentElement.InnerXml;
- }
- else
- {
- return o.ToString();
- }
- }
- private static void SetWebRequest(HttpWebRequest request)
- {
- request.Credentials = CredentialCache.DefaultCredentials;
- request.Timeout = 10000;
- }
- private static void WriteRequestData(HttpWebRequest request, byte[] data)
- {
- request.ContentLength = data.Length;
- Stream writer = request.GetRequestStream();
- writer.Write(data, 0, data.Length);
- writer.Close();
- }
- private static byte[] EncodePars(Hashtable Pars)
- {
- return Encoding.UTF8.GetBytes(ParsToString(Pars));
- }
- private static String ParsToString(Hashtable Pars)
- {
- StringBuilder sb = new StringBuilder();
- foreach (string k in Pars.Keys)
- {
- if (sb.Length > 0)
- {
- sb.Append("&");
- }
- sb.Append(HttpUtility.UrlEncode(k) + "=" + HttpUtility.UrlEncode(Pars[k].ToString()));
- }
- return sb.ToString();
- }
- private static XmlDocument ReadXmlResponse(WebResponse response)
- {
- StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
- String retXml = sr.ReadToEnd();
- sr.Close();
- XmlDocument doc = new XmlDocument();
- doc.LoadXml(retXml);
- return doc;
- }
- private static void AddDelaration(XmlDocument doc)
- {
- XmlDeclaration decl = doc.CreateXmlDeclaration("1.0", "utf-8", null);
- doc.InsertBefore(decl, doc.DocumentElement);
- }
- }
调用:
- void btnTest2_Click(object sender, EventArgs e)
- {
- try
- {
- Hashtable pars = new Hashtable();
- String Url = "http://www.webxml.com.cn/Webservices/WeatherWebService.asmx";
- XmlDocument doc = WebSvcCaller.QuerySoapWebService(Url, "getSupportProvince", pars);
- Response.Write(doc.OuterXml);
- }
- catch (Exception ex)
- {
- Response.Write(ex.Message);
- }
- }
三、Java使用SOAP调用webservice实例解析
参照:http://www.cnblogs.com/linjiqin/archive/2012/05/07/2488880.html
1.webservice提供方:http://www.webxml.com.cn/zh_cn/index.aspx
2.下面我们以“获得腾讯QQ在线状态”为例。
[http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx?op=qqCheckOnline] 点击前面的网址,查看对应参数信息。
3.Java程序
- package com.test.qqwstest;
- import java.io.BufferedReader;
- import java.io.BufferedWriter;
- import java.io.ByteArrayOutputStream;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.InputStreamReader;
- import java.io.OutputStream;
- import java.io.OutputStreamWriter;
- import java.io.PrintWriter;
- import java.io.UnsupportedEncodingException;
- import java.net.HttpURLConnection;
- import java.net.URL;
- public class JxSendSmsTest {
- public static void main(String[] args) {
- sendSms();
- }
- /**
- * 获得腾讯QQ在线状态
- *
- * 输入参数:QQ号码 String,默认QQ号码:8698053。返回数据:String,Y = 在线;N = 离线;E = QQ号码错误;A = 商业用户验证失败;V = 免费用户超过数量
- * @throws Exception
- */
- public static void sendSms() {
- try{
- String qqCode = "2379538089";//qq号码
- String urlString = "http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx";
- String xml = JxSendSmsTest.class.getClassLoader().getResource("SendInstantSms.xml").getFile();
- String xmlFile=replace(xml, "qqCodeTmp", qqCode).getPath();
- String soapActionString = "http://WebXml.com.cn/qqCheckOnline";
- URL url = new URL(urlString);
- HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
- File fileToSend = new File(xmlFile);
- byte[] buf = new byte[(int) fileToSend.length()];
- new FileInputStream(xmlFile).read(buf);
- httpConn.setRequestProperty("Content-Length", String.valueOf(buf.length));
- httpConn.setRequestProperty("Content-Type", "text/xml; charset=utf-8");
- httpConn.setRequestProperty("soapActionString", soapActionString);
- httpConn.setRequestMethod("POST");
- httpConn.setDoOutput(true);
- httpConn.setDoInput(true);
- OutputStream out = httpConn.getOutputStream();
- out.write(buf);
- out.close();
- byte[] datas=readInputStream(httpConn.getInputStream());
- String result=new String(datas);
- //打印返回结果
- System.out.println("result:" + result);
- }
- catch(Exception e){
- System.out.println("result:error!");
- }
- }
- /**
- * 文件内容替换
- *
- * @param inFileName 源文件
- * @param from
- * @param to
- * @return 返回替换后文件
- * @throws IOException
- * @throws UnsupportedEncodingException
- */
- public static File replace(String inFileName, String from, String to)
- throws IOException, UnsupportedEncodingException {
- File inFile = new File(inFileName);
- BufferedReader in = new BufferedReader(new InputStreamReader(
- new FileInputStream(inFile), "utf-8"));
- File outFile = new File(inFile + ".tmp");
- PrintWriter out = new PrintWriter(new BufferedWriter(
- new OutputStreamWriter(new FileOutputStream(outFile), "utf-8")));
- String reading;
- while ((reading = in.readLine()) != null) {
- out.println(reading.replaceAll(from, to));
- }
- out.close();
- in.close();
- //infile.delete(); //删除源文件
- //outfile.renameTo(infile); //对临时文件重命名
- return outFile;
- }
- /**
- * 从输入流中读取数据
- * @param inStream
- * @return
- * @throws Exception
- */
- public static byte[] readInputStream(InputStream inStream) throws Exception{
- ByteArrayOutputStream outStream = new ByteArrayOutputStream();
- byte[] buffer = new byte[1024];
- int len = 0;
- while( (len = inStream.read(buffer)) !=-1 ){
- outStream.write(buffer, 0, len);
- }
- byte[] data = outStream.toByteArray();//网页的二进制数据
- outStream.close();
- inStream.close();
- return data;
- }
- }
4、SendInstantSms.xml文件如下,放在src目录下
- <?xml version="1.0" encoding="utf-8"?>
- <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
- <soap:Body>
- <qqCheckOnline xmlns="http://WebXml.com.cn/">
- <qqCode>qqCodeTmp</qqCode>
- </qqCheckOnline>
- </soap:Body>
- </soap:Envelope>
C#/Java 调用WSDL接口及方法的更多相关文章
- [Java] java调用wsdl接口
前提: ① 已经提供了一个wsdl接口 ② 该接口能正常调用 步骤1:使用cxf的wsdl2java工具生成本地类 下载CXF:http://cxf.apache.org/download.html ...
- C#.NET调用WSDL接口及方法
1.首先需要清楚WSDL的引用地址 如:http://XX.XX.4.146:8089/axis/services/getfileno?wsdl 上述地址的构造为 类名getfileno. 2.在.N ...
- C# 调用WSDL接口及方法
1.首先需要清楚WSDL的引用地址 如:http://XX.XX.4.146:8089/axis/services/getfileno?wsdl 上述地址的构造为 类名getfileno. 2.在.N ...
- Java调用WSDL接口
1.首先准备jar包: 2.代码调用如下: String url="url地址"; QName qName=new QName("命名空间","接口名 ...
- java调用restful接口的方法
Restful接口的调用,前端一般使用ajax调用,后端可以使用的方法如下: 1.HttpURLConnection实现 2.HttpClient实现 3.Spring的RestTemplate
- Java调用webservice接口方法
java调用webservice接口 webservice的 发布一般都是使用WSDL(web service descriptive langu ...
- java 调用webservice的各种方法总结
java 调用webservice的各种方法总结 几种流行的开源WebService框架Axis1,Axis2,Xfire,CXF,JWS比较 方法一:创建基于JAX-WS的webservice(包括 ...
- C# 不添加WEB引用调用WSDL接口
在项目中添加WEB引用耦合度较高,更新时要更新引用,所以我建议不添加WEB引用调用WSDL接口,废话不多说,直接上代码 例如WSDL地址为:http://XXX.XX.XXX.XXX:9115/WsP ...
- Java 调用http接口(基于OkHttp的Http工具类方法示例)
目录 Java 调用http接口(基于OkHttp的Http工具类方法示例) OkHttp3 MAVEN依赖 Http get操作示例 Http Post操作示例 Http 超时控制 工具类示例 Ja ...
随机推荐
- 【canvas学习笔记三】样式和颜色
上一节我们学习了如何用路径绘制各种形状,但我们只能用默认的颜色和线条.这节就来学习设置不同的颜色和线条样式. 颜色 设置颜色主要有两个属性: fillStyle = color 设置填充颜色 stro ...
- maven工程项目与项目之间的依赖方式
首先看一下项目结构: 1.需要在父工程中把子工程为坐标引进来,同时标注父工程为pom工程: 2.同时在父工程中把子工程当作一个模块引进来 3.需要在每一个子项目中通过parent标签,标注 ...
- 阿里云OSS文件上传封装
1.先用composer安装阿里云OSS的PHPSDK 2.配置文件里定义阿里云OSS的秘钥 3.在index控制器里的代码封装 <?php namespace app\index\contro ...
- 白鹭http请求post
示例demo: //new http请求 var request = new egret.HttpRequest(); //请求参数 var params = "p1=postP1& ...
- 【机器学习速成宝典】模型篇05朴素贝叶斯【Naive Bayes】(Python版)
目录 先验概率与后验概率 条件概率公式.全概率公式.贝叶斯公式 什么是朴素贝叶斯(Naive Bayes) 拉普拉斯平滑(Laplace Smoothing) 应用:遇到连续变量怎么办?(多项式分布, ...
- STOMP协议详解
STOMP协议详解 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs 一.STOMP协议介绍 STOMP即Simple (or Streaming) T ...
- phpstudy composer 安装
今天突然发现phpstudy 可以安装 composer 一打开php中openssl拓展 坑一 我的phpstudy 是2018最新版本,但是你下载laravel什么之类库会报错,是由于compo ...
- fixture之autouse=True
平常写自动化用例会写一些前置的fixture操作,用例需要用到就直接传该函数的参数名称就行了.当用例很多的时候,每次都传这个参数,会比较麻烦.fixture里面有个参数autouse,默认是Fasle ...
- Python学习之==>URL编码解码&if __name__ == '__main__'
一.URL编码解码 url的编码解码需要用到标准模块urllib中的parse方法 from urllib import parse url = 'http://www.baidu.com?query ...
- 别把&和nohup混为一谈, 根本不是同一个东西好不好 ------ 聊聊./a.out & , nohut ./a.out , nohup ./a.out &的区别
在第一家公司工作的时候, 我认识了&,在第二家公司工作的时候, 我认识了nohup, 这就是渊源. 随后, 我就一直糊涂用他们, 但并不懂这两个东西. 网上很多地方是乱扯, 瞎复制, 为什 ...