C#/Java 调用WSDL接口及方法
一、C#利用vs里面自带的“添加web引用”功能:
1.首先需要清楚WSDL的引用地址
如:http://www.webxml.com.cn/Webservices/WeatherWebService.asmx
2.在.Net项目中,添加web引用。
3.在弹出页面中,输入URL->点击点击绿色图标(前往)按钮->自定义引用名->点击添加引用
4.添加成功,查看类中可调用的方法:
5.在项目中,调用wsdl中的方法。
- privatevoidbutton1_Click(objectsender,EventArgse)
- {
- testWS2.Weather.WeatherWebServiceobjWeather=newWeather.WeatherWebService();
- stringstrCityName="上海";
- 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来完成各种网络查询操作。为了精简明了,这个类中没有添加错误处理,需要在调用的地方设置异常捕获。
- usingSystem;
- usingSystem.Web;
- usingSystem.Xml;
- usingSystem.Collections;
- usingSystem.Net;
- usingSystem.Text;
- usingSystem.IO;
- usingSystem.Xml.Serialization;
- //Byhuangz2008-3-19
- /**/
- ///<summary>
- ///利用WebRequest/WebResponse进行WebService调用的类,By同济黄正http://hz932.ys168.com2008-3-19
- ///</summary>
- publicclassWebSvcCaller
- {
- //<webServices>
- //<protocols>
- //<addname="HttpGet"/>
- //<addname="HttpPost"/>
- //</protocols>
- //</webServices>
- privatestaticHashtable_xmlNamespaces=newHashtable();//缓存xmlNamespace,避免重复调用GetNamespace
- /**/
- ///<summary>
- ///需要WebService支持Post调用
- ///</summary>
- publicstaticXmlDocumentQueryPostWebService(StringURL,StringMethodName,HashtablePars)
- {
- HttpWebRequestrequest=(HttpWebRequest)HttpWebRequest.Create(URL+"/"+MethodName);
- request.Method="POST";
- request.ContentType="application/x-www-form-urlencoded";
- SetWebRequest(request);
- byte[]data=EncodePars(Pars);
- WriteRequestData(request,data);
- returnReadXmlResponse(request.GetResponse());
- }
- /**/
- ///<summary>
- ///需要WebService支持Get调用
- ///</summary>
- publicstaticXmlDocumentQueryGetWebService(StringURL,StringMethodName,HashtablePars)
- {
- HttpWebRequestrequest=(HttpWebRequest)HttpWebRequest.Create(URL+"/"+MethodName+"?"+ParsToString(Pars));
- request.Method="GET";
- request.ContentType="application/x-www-form-urlencoded";
- SetWebRequest(request);
- returnReadXmlResponse(request.GetResponse());
- }
- /**/
- ///<summary>
- ///通用WebService调用(Soap),参数Pars为String类型的参数名、参数值
- ///</summary>
- publicstaticXmlDocumentQuerySoapWebService(StringURL,StringMethodName,HashtablePars)
- {
- if(_xmlNamespaces.ContainsKey(URL))
- {
- returnQuerySoapWebService(URL,MethodName,Pars,_xmlNamespaces[URL].ToString());
- }
- else
- {
- returnQuerySoapWebService(URL,MethodName,Pars,GetNamespace(URL));
- }
- }
- privatestaticXmlDocumentQuerySoapWebService(StringURL,StringMethodName,HashtablePars,stringXmlNs)
- {
- _xmlNamespaces[URL]=XmlNs;//加入缓存,提高效率
- HttpWebRequestrequest=(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);
- XmlDocumentdoc=newXmlDocument(),doc2=newXmlDocument();
- doc=ReadXmlResponse(request.GetResponse());
- XmlNamespaceManagermgr=newXmlNamespaceManager(doc.NameTable);
- mgr.AddNamespace("soap","http://schemas.xmlsoap.org/soap/envelope/");
- StringRetXml=doc.SelectSingleNode("//soap:Body/*/*",mgr).InnerXml;
- doc2.LoadXml("<root>"+RetXml+"</root>");
- AddDelaration(doc2);
- returndoc2;
- }
- privatestaticstringGetNamespace(StringURL)
- {
- HttpWebRequestrequest=(HttpWebRequest)WebRequest.Create(URL+"?WSDL");
- SetWebRequest(request);
- WebResponseresponse=request.GetResponse();
- StreamReadersr=newStreamReader(response.GetResponseStream(),Encoding.UTF8);
- XmlDocumentdoc=newXmlDocument();
- doc.LoadXml(sr.ReadToEnd());
- sr.Close();
- returndoc.SelectSingleNode("//@targetNamespace").Value;
- }
- privatestaticbyte[]EncodeParsToSoap(HashtablePars,StringXmlNs,StringMethodName)
- {
- XmlDocumentdoc=newXmlDocument();
- doc.LoadXml("<soap:Envelopexmlns: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);
- XmlElementsoapBody=doc.CreateElement("soap","Body","http://schemas.xmlsoap.org/soap/envelope/");
- XmlElementsoapMethod=doc.CreateElement(MethodName);
- soapMethod.SetAttribute("xmlns",XmlNs);
- foreach(stringkinPars.Keys)
- {
- XmlElementsoapPar=doc.CreateElement(k);
- soapPar.InnerXml=ObjectToSoapXml(Pars[k]);
- soapMethod.AppendChild(soapPar);
- }
- soapBody.AppendChild(soapMethod);
- doc.DocumentElement.AppendChild(soapBody);
- returnEncoding.UTF8.GetBytes(doc.OuterXml);
- }
- privatestaticstringObjectToSoapXml(objecto)
- {
- XmlSerializermySerializer=newXmlSerializer(o.GetType());
- MemoryStreamms=newMemoryStream();
- mySerializer.Serialize(ms,o);
- XmlDocumentdoc=newXmlDocument();
- doc.LoadXml(Encoding.UTF8.GetString(ms.ToArray()));
- if(doc.DocumentElement!=null)
- {
- returndoc.DocumentElement.InnerXml;
- }
- else
- {
- returno.ToString();
- }
- }
- privatestaticvoidSetWebRequest(HttpWebRequestrequest)
- {
- request.Credentials=CredentialCache.DefaultCredentials;
- request.Timeout=10000;
- }
- privatestaticvoidWriteRequestData(HttpWebRequestrequest,byte[]data)
- {
- request.ContentLength=data.Length;
- Streamwriter=request.GetRequestStream();
- writer.Write(data,0,data.Length);
- writer.Close();
- }
- privatestaticbyte[]EncodePars(HashtablePars)
- {
- returnEncoding.UTF8.GetBytes(ParsToString(Pars));
- }
- privatestaticStringParsToString(HashtablePars)
- {
- StringBuildersb=newStringBuilder();
- foreach(stringkinPars.Keys)
- {
- if(sb.Length>0)
- {
- sb.Append("&");
- }
- sb.Append(HttpUtility.UrlEncode(k)+"="+HttpUtility.UrlEncode(Pars[k].ToString()));
- }
- returnsb.ToString();
- }
- privatestaticXmlDocumentReadXmlResponse(WebResponseresponse)
- {
- StreamReadersr=newStreamReader(response.GetResponseStream(),Encoding.UTF8);
- StringretXml=sr.ReadToEnd();
- sr.Close();
- XmlDocumentdoc=newXmlDocument();
- doc.LoadXml(retXml);
- returndoc;
- }
- privatestaticvoidAddDelaration(XmlDocumentdoc)
- {
- XmlDeclarationdecl=doc.CreateXmlDeclaration("1.0","utf-8",null);
- doc.InsertBefore(decl,doc.DocumentElement);
- }
- }
调用:
- voidbtnTest2_Click(objectsender,EventArgse)
- {
- try
- {
- Hashtablepars=newHashtable();
- StringUrl="http://www.webxml.com.cn/Webservices/WeatherWebService.asmx";
- XmlDocumentdoc=WebSvcCaller.QuerySoapWebService(Url,"getSupportProvince",pars);
- Response.Write(doc.OuterXml);
- }
- catch(Exceptionex)
- {
- 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程序
- packagecom.test.qqwstest;
- importjava.io.BufferedReader;
- importjava.io.BufferedWriter;
- importjava.io.ByteArrayOutputStream;
- importjava.io.File;
- importjava.io.FileInputStream;
- importjava.io.FileOutputStream;
- importjava.io.IOException;
- importjava.io.InputStream;
- importjava.io.InputStreamReader;
- importjava.io.OutputStream;
- importjava.io.OutputStreamWriter;
- importjava.io.PrintWriter;
- importjava.io.UnsupportedEncodingException;
- importjava.net.HttpURLConnection;
- importjava.net.URL;
- publicclassJxSendSmsTest{
- publicstaticvoidmain(String[]args){
- sendSms();
- }
- /**
- *获得腾讯QQ在线状态
- *
- *输入参数:QQ号码String,默认QQ号码:8698053。返回数据:String,Y=在线;N=离线;E=QQ号码错误;A=商业用户验证失败;V=免费用户超过数量
- *@throwsException
- */
- publicstaticvoidsendSms(){
- try{
- StringqqCode="2379538089";//qq号码
- StringurlString="http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx";
- Stringxml=JxSendSmsTest.class.getClassLoader().getResource("SendInstantSms.xml").getFile();
- StringxmlFile=replace(xml,"qqCodeTmp",qqCode).getPath();
- StringsoapActionString="http://WebXml.com.cn/qqCheckOnline";
- URLurl=newURL(urlString);
- HttpURLConnectionhttpConn=(HttpURLConnection)url.openConnection();
- FilefileToSend=newFile(xmlFile);
- byte[]buf=newbyte[(int)fileToSend.length()];
- newFileInputStream(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);
- OutputStreamout=httpConn.getOutputStream();
- out.write(buf);
- out.close();
- byte[]datas=readInputStream(httpConn.getInputStream());
- Stringresult=newString(datas);
- //打印返回结果
- System.out.println("result:"+result);
- }
- catch(Exceptione){
- System.out.println("result:error!");
- }
- }
- /**
- *文件内容替换
- *
- *@paraminFileName源文件
- *@paramfrom
- *@paramto
- *@return返回替换后文件
- *@throwsIOException
- *@throwsUnsupportedEncodingException
- */
- publicstaticFilereplace(StringinFileName,Stringfrom,Stringto)
- throwsIOException,UnsupportedEncodingException{
- FileinFile=newFile(inFileName);
- BufferedReaderin=newBufferedReader(newInputStreamReader(
- newFileInputStream(inFile),"utf-8"));
- FileoutFile=newFile(inFile+".tmp");
- PrintWriterout=newPrintWriter(newBufferedWriter(
- newOutputStreamWriter(newFileOutputStream(outFile),"utf-8")));
- Stringreading;
- while((reading=in.readLine())!=null){
- out.println(reading.replaceAll(from,to));
- }
- out.close();
- in.close();
- //infile.delete();//删除源文件
- //outfile.renameTo(infile);//对临时文件重命名
- returnoutFile;
- }
- /**
- *从输入流中读取数据
- *@paraminStream
- *@return
- *@throwsException
- */
- publicstaticbyte[]readInputStream(InputStreaminStream)throwsException{
- ByteArrayOutputStreamoutStream=newByteArrayOutputStream();
- byte[]buffer=newbyte[1024];
- intlen=0;
- while((len=inStream.read(buffer))!=-1){
- outStream.write(buffer,0,len);
- }
- byte[]data=outStream.toByteArray();//网页的二进制数据
- outStream.close();
- inStream.close();
- returndata;
- }
- }
4、SendInstantSms.xml文件如下,放在src目录下
- <?xmlversion="1.0"encoding="utf-8"?>
- <soap:Envelopexmlns: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>
- <qqCheckOnlinexmlns="http://WebXml.com.cn/">
- <qqCode>qqCodeTmp</qqCode>
- </qqCheckOnline>
- </soap:Body>
- </soap:Envelope>
更多相关文章
- Javadoc转换chm帮助文档的四种方法总结
- 最新Eclipse配置Android开发环境SDK 并安装JellyBean 4.3的方法
- Android 两种制作圆形/圆角图片的方法
- 在android中运行java main方法
- android studio 无法调试安装到小米手机解决方法
- OpenGL es 2.0使用shadow mapping方法制作阴影时,阴影穿透实体现
- Android studio Run 出现 红叉 AndroidRunConfigurationType 问
- 如何在函数中将两个参数从1个类传递给另一个?
- 如何在Log中模拟方法e