精华内容
下载资源
问答
  • webservice客户端命名空间

    万次阅读 2018-02-11 16:23:57
    一:开发背景webservice通讯时经常会遇到命名空间不符的情况,比如全系统统一使用一套规范,但是某些系统提供的服务命名不是很统一,由其提供的wsdl文件生成的客户端的命名空间也随之不统一,因此就需要调用方开发...

    一:开发背景

    webservice通讯时经常会遇到命名空间不符的情况,比如全系统统一使用一套规范,但是某些系统提供的服务命名不是很统一,由其提供的wsdl文件生成的客户端的命名空间也随之不统一,因此就需要调用方开发客户端时修改命名空间。

    1:全系统统一使用的命名空间

    <soapenv:envelope
    xmlns:soapenv="http://shcemas.xnlsoap.org/soap/envelope/"
    xmlns:s="http://127.0.0.1:8888/UPB"
    xmlns:tns="http://127.0.0.1:8888/UPB/wsdl">
    	<soapenv:Header/>
    	<soapenv:Body>
    		<tns:ReqS00000000001>
    			<s:ReqSysHead>
    				<s:SvcId>?</s:SvcId>
    				<s:SvcScn>?</s:SvcScn>
    			</s:ReqSysHead>
    		</tns:ReqS00000000001>
    	</soapenv:Body>
    </soapenv:envelope>

    2:其他系统提供的webservice服务

    <soapenv:envelope
    xmlns:soapenv="http://shcemas.xnlsoap.org/soap/envelope/"
    xmlns:upb="http://127.0.0.1:8888/UPB"
    	<soapenv:Header/>
    	<soapenv:Body>
    		<upb:ReqS00000000001>
    			<upb:ReqSysHead>
    				<upb:SvcId>?</upb:SvcId>
    				<upb:SvcScn>?</upb:SvcScn>
    			</upb:ReqSysHead>
    		</upb:ReqS00000000001>
    	</soapenv:Body>
    </soapenv:envelope>

    由以上两图可见,其他系统提供的服务文件的命名空间少了一层【请求类的命名空间】,而且属性的命名空间也不标准

    在 http://blog.csdn.net/tangmingxin0529/article/details/79310256 这篇文章中有客户端代码的生成过程介绍。

    二:客户端命名空间修改

    1:请求类的命名空间修改

    Stub类中有webservice服务的调用方法,其参数类的类定义处既有请求类的命名空间设置。

    public static class ReqS00000000001 implements
    	org.apache.axis2.databinding.ADBBean{
       public static final javax.xml.namespace.QName MY_QNAME=
    		new javax.xml.namespace.QName(
    		"http://127.0.0.1:8888/UPB","ReqS00000000001","ns1")
    	}

    从最初的客户端代码可见,请求类的命名空间为UPB,这里需要先将其修改为

    public static class ReqS00000000001 implements
    	org.apache.axis2.databinding.ADBBean{
       public static final javax.xml.namespace.QName MY_QNAME=
    		new javax.xml.namespace.QName(
    		"http://127.0.0.1:8888/UPB/wsdl","ReqS00000000001","tns")
    	}

    这样请求类的命名空间暂时变成了wsdl,并且命名空间会由两个变成3个

    2:返回类的命名空间修改

    最初的返回类命名空间也为UPB,这样在调用服务返回是会报Unexpected subelement RspS00000000001异常

    while(!reader.isEndElement()){
    	if(reader.isStartElement()){
    	if(reader.isStartElement()&& new javax.xml.namespace.QName(
    	"http://127.0.0.1:8888/UPB","RspS00000000001").equals(reader.getName())){
    	object.setRspS00000000001(RspS00000000001Type.Factory.parse(reader));}
    返回类的命名空间修改并不在其类的定义处修改,而是在
    public static class Factory{
    	public static RspS00000000001 parse(javax.xml.stream.XMLStreamReader reader){

    这个方法中进行修改的,Factory会进行命名空间的校验及字段的校验

    public static class Factory{
    	public static RspS00000000001 parse(javax.xml.stream.XMLStreamReader reader){
    	......
    	while(!reader.isEndElement()){
    	if(reader.isStartElement()){
    	if(reader.isStartElement()&& new javax.xml.namespace.QName(
    	"http://127.0.0.1:8888/UPB/wsdl","RspS00000000001").equals(reader.getName())){
    	object.setRspS00000000001(RspS00000000001Type.Factory.parse(reader));}
    	......

    3:截止目前,请求类和返回类的命名空间都已经进行了修改,但是这只能在原有的两层命名空间上加上第三个命名空间,并不是最终的统一样式

    private org.apache.axiom.soap.SOAPEnvelope toEnvelope(
    	  org.apache.axiom.soap.SOAPFactory factory,
    	  .......ReqS00000000001  param,
    	  boolean optimizeContent) throws org.apache.axis2.AxisFault{
    	  try{
    		org.apache.axiom.soap.SOAPEnvelope emptyEnvelope=factory.getDefaultEnvelope();
    		//-------------------手动添加---------------------
    		emptyEnvelope.declareNamespace(
    			"http://127.0.0.1:8888/UPB/wsdl","tns";
    		emptyEnvelope.declareNamespace(
    			"http://127.0.0.1:8888/UPB","s"
    			);
    		//-------------------手动添加---------------------
    添加这几行代码之后,所以的命名空间为wsdl都是转换成tns,所以属性的命名空间upb都会转换成s。现在即为全系统统一的标准soap报文格式。
    展开全文
  • webService

    2014-05-22 10:48:21
    c++动态调用WebService,服务器地址,命名空间,方法等。
  • C# WebService 更改命名空间

    千次阅读 2018-09-26 17:27:17
    创建好一个WebService之后改了代码中的命名空间,结果调用不到, 很明显示报错的命名空间与代码中的命名空间名称不一样. 需要用记事本这一类的工具打开对应的asmx文件(文件中有一行和报错提示的这一行一样)手动修改...

    创建好一个WebService之后改了代码中的命名空间,结果调用不到, 很明显示报错的命名空间与代码中的命名空间名称不一样.

    需要用记事本这一类的工具打开对应的asmx文件(文件中有一行和报错提示的这一行一样)手动修改一下就好了.

     

    展开全文
  • WebService

    热门讨论 2015-06-14 22:12:22
    WebService  从牛腩新闻系统后来了解到WebService,这是一种基于SOAP协议的远程调用标准,通 过webservice可以将不同操作系统平台、不同语言、不同技术整合到一块。在Android  SDK中并没有提供调用WebService的...

                                      

              WebService



       从牛腩新闻系统后来了解到WebService,这是一种基于SOAP协议的远程调用标准,通

    过webservice可以将不同操作系统平台、不同语言、不同技术整合到一块。在Android 

    SDK中并没有提供调用WebService的库,因此,需要使用第三方的SDK来调用

    WebService。PC版本的WEbservice客户端库非常丰富,例如Axis2,CXF等,但这些开发

    包对于Android系统过于庞大,也未必很容易移植到Android系统中。因此,这些开发包

    并不是在我们的考虑范围内。适合手机的WebService客户端的SDK有一些,比较常用的有

    Ksoap2,可以从http://code.google.com/p/ksoap2-android/downloads/list进行下

    载;将下载的ksoap2-android-assembly-2.4-jar-with-dependencies.jar包复制到

    Eclipse工程的lib目录中,当然也可以放在其他的目录里。同时在Eclipse工程中引用这

    个jar包。


     具体调用调用webservice的方法为:


    (1)指定webservice的命名空间和调用的方法名,如:

    SoapObject request =new SoapObject(http://service,”getName”);

    SoapObject类的第一个参数表示WebService的命名空间,可以从WSDL文档中找到

    WebService的命名空间。

     

       第二个参数表示要调用的WebService方法名。



    (2)设置调用方法的参数值,如果没有参数,可以省略,设置方法的参数值的代码如

    下:


    <span style="font-family:KaiTi_GB2312;font-size:24px;">Request.addProperty(“param1”,”value”);
    Request.addProperty(“param2”,”value”);</span>

    要注意的是,addProperty方法的第1个参数虽然表示调用方法的参数名,但该参数值并

    不一定与服务端的WebService类中的方法参数名一致,只要设置参数的顺序一致即可。

    (3)生成调用Webservice方法的SOAP请求信息。该信息由SoapSerializationEnvelope

    对象描述,代码为:

    SoapSerializationEnvelope envelope=new  SoapSerializationEnvelope(SoapEnvelope.VER11);
    Envelope.bodyOut = request;
    

      创建SoapSerializationEnvelope对象时需要通过SoapSerializationEnvelope类的构

    造方法设置SOAP协议的版本号。该版本号需要根据服务端WebService的版本号设置。在

    创建SoapSerializationEnvelope对象后,不要忘了设置

    SOAPSoapSerializationEnvelope类的bodyOut属性,该属性的值就是在第一步创建的

    SoapObject对象。


    (4)创建HttpTransportsSE对象。通过HttpTransportsSE类的构造方法可以指定WebService的WSDL文档的URL:
    HttpTransportSE ht=new

    HttpTransportSE(“http://192.168.18.17:80

    /axis2/service/SearchNewsService?wsdl”);



    (5)使用call方法调用WebService方法,代码:

    ht.call(null,envelope);

    Call方法的第一个参数一般为null,第2个参数就是在第3步创建的

    SoapSerializationEnvelope对象。


    (6)使用getResponse方法获得WebService方法的返回结果,代码:

    SoapObject soapObject =( SoapObject) envelope.getResponse();


    以下为简单的实现一个查看当前天气功能的例子:


    <span style="font-family:KaiTi_GB2312;font-size:24px;">publicclass WebService extends Activity { 
    
    privatestaticfinal String NAMESPACE ="http://WebXml.com.cn/"; 
    
    // WebService地址 
    
    privatestatic String URL ="http://www.webxml.com.cn/
    
    webservices/weatherwebservice.asmx"; 
    
    privatestaticfinal String METHOD_NAME ="getWeatherbyCityName"; 
    
    privatestatic String SOAP_ACTION ="http://WebXml.com.cn/
    
    getWeatherbyCityName"; 
    
     
    
    private String weatherToday; 
    
     
    
    private Button okButton; 
    
    private SoapObject detail; 
    
     
    
    @Override 
    
    publicvoid onCreate(Bundle savedInstanceState) { 
    
      super.onCreate(savedInstanceState); 
    
      setContentView(R.layout.main); 
    
      okButton = (Button) findViewById(R.id.ok); 
    
     
    
      okButton.setOnClickListener(new Button.OnClickListener() { 
    
          publicvoid onClick(View v) { 
    
             showWeather(); 
    
          } 
    
      }); 
    
    } 
    
     
    
    privatevoid showWeather() { 
    
      String city ="北京"; 
    
      getWeather(city); 
    
    } 
    
     
    
    @SuppressWarnings("deprecation") 
    
    publicvoid getWeather(String cityName) { 
    
    try { 
    
     System.out.println("rpc------"); 
    
      SoapObject rpc =new SoapObject(NAMESPACE, METHOD_NAME); 
    
      System.out.println("rpc"+ rpc); 
    
      System.out.println("cityName is "+ cityName); 
    
     rpc.addProperty("theCityName", cityName); 
    
     
    
      AndroidHttpTransport ht =new AndroidHttpTransport(URL);  //AndroidHttpTransport 是一个要过期的类,可以使用HttpTransportsSE对象
    
      ht.debug =true; 
    
     
    
    SoapSerializationEnvelope envelope =new SoapSerializationEnvelope( 
    
              SoapEnvelope.VER11); 
    
     
    
      envelope.bodyOut = rpc; 
    
      envelope.dotNet =true; 
    
     envelope.setOutputSoapObject(rpc); 
    
     
    
      ht.call(SOAP_ACTION, envelope); 
    
     
    
     SoapObject result = (SoapObject) envelope.bodyIn;  
    
      detail = (SoapObject) result 
    
              .getProperty("getWeatherbyCityNameResult"); 
    
     
    
      System.out.println("result"+ result); 
    
      System.out.println("detail"+ detail); 
    
      Toast.makeText(WebService.this, detail.toString(), 
    
             Toast.LENGTH_LONG).show(); 
    
      parseWeather(detail); 
    
     
    
      return; 
    
    } catch (Exception e) { 
    
      e.printStackTrace(); 
    
      } 
    
    } 
    
     
    
    privatevoid parseWeather(SoapObject detail) 
    
          throws UnsupportedEncodingException { 
    
      String date = detail.getProperty(6).toString();  
    
      weatherToday ="今天:"+ date.split("")[0]; 
    
      weatherToday = weatherToday +"\n天气:"+ date.split("")[1]; 
    
      weatherToday = weatherToday +"\n气温:" 
    
              + detail.getProperty(5).toString(); 
    
     weatherToday = weatherToday +"\n风力:" 
    
              + detail.getProperty(7).toString() +"\n"; 
    
      System.out.println("weatherToday is "+ weatherToday); 
    
      Toast.makeText(WebService.this, weatherToday,
    
      Toast.LENGTH_LONG).show(); 
    
     
    
     } 
    
    }
    
     
    </span>



      项目遇到的bug如下:当手机使用wifi或者net访问webservice的时候一切正常,但是

    当手机网络为wap的情况下,就连接失败。解决办法:ksoap2-android最新版本是

    2.5.4。在2.5.2之前源码都是不支持代理访问的,在2.5.4之后,源码增加了对网络有代

    理的支持。

    <span style="font-family:KaiTi_GB2312;font-size:24px;">//判断当前网络是否是net,true为net,false为wap
    
    
           public static boolean isGprsNet(){
    
    
                  String proxyHost = android.net.Proxy.getDefaultHost();
    
    
                  return proxyHost==null;
    
    
           }
    
    
          
    
    
           //根据网络类型返回相应的HttpTransportSE  webservice用
    
    
           public static HttpTransportSE getHttpTransportSE(Context context){
    
    
                  HttpTransportSE ht;
    
    
                  if(!HttpUtil.isGprsNet()){
    
    
                      java.net.Proxy p = new java.net.Proxy(java.net.Proxy.Type.HTTP,new InetSocketAddress(android.net.Proxy.getDefaultHost(),android.net.Proxy.getDefaultPort()));
    
    
                      ht=new HttpTransportSE(p,context.getString(R.string.wsurl));
    
    
               }else{
    
    
                      ht = new HttpTransportSE(context.getString(R.string.wsurl));
    
    
               }
    
    
                  return ht;
    
    
           }
    
    
           /*
    
    
            * 登录接口  1成功  0失败
    
    
            */
    
    
           public String login(Context context,String phoneNumber,String pwd){
    
    
                  SoapObject request = new SoapObject(context.getString(R.string.namespace), "login");
    
    
                  request.addProperty("usrPhone", phoneNumber);
    
    
                  request.addProperty("passWord", pwd);
    
    
                  SoapSerializationEnvelope envelope = new SoapSerializationEnvelope( SoapEnvelope.VER11 );
    
    
               envelope.bodyOut=request;
    
    
               HttpTransportSE ht = HttpUtil.getHttpTransportSE(context);
    
    
               try {
    
    
                         ht.call(null, envelope);
    
    
                  } catch (Exception e) {}
    
    
                  SoapObject so = null;
    
    
                  so = (SoapObject) envelope.bodyIn;
    
    
                  String result= so.getProperty("return").toString();
    
    
                  return result;
    
    
           }
    </span>


    androi下net和wap自适应代码:



    <span style="font-family:KaiTi_GB2312;font-size:24px;">private HttpURLConnection getURLConnection(String url) throws Exception {    
    
              String proxyHost = android.net.Proxy.getDefaultHost();    
    
              if (proxyHost != null) {    
    
                  java.net.Proxy p = new java.net.Proxy(java.net.Proxy.Type.HTTP,    
    
                          new InetSocketAddress(android.net.Proxy.getDefaultHost(),    
    
                                  android.net.Proxy.getDefaultPort()));    
    
         
    
                  return (HttpURLConnection) new URL(url).openConnection(p);    
    
          
    
             } else {    
    
                 return (HttpURLConnection) new URL(url).openConnection();    
    
             }    
    
         }   
    
     </span>










    展开全文
  • WebService命名空间冲突

    千次阅读 2014-07-09 18:43:57
    最近,在写webservice的项目时,遇到了几个接口中

    最近,在写webservice的项目时,遇到了几个接口中都用到同一个类名称,结果在进行项目编译时,浏览器中出现如下错误


    根据提示信息,使用XML属性为该类型指定唯一的XML名称和/或命名空间。

    2014/7/28补充

    1、因为在WebService中,若没有给指定为DataContract属性的类指定命名空间,那么该类那序列化时,命名空间被指定为该WebService的命名空间,如WebService的命名空间是http://tempuri.org,在两天同名类都添加到该命名空间时,显然会产生冲突,故需要为同名类指定不同命名空间。需要在指出的是,DataContract类属性Namespace指定数据协定的命名空间似乎不起作用,所以用XML属性进行指定。

    2、WebService与WCF的区别:在WCF中自定义类只需要给自定义类添加DataContract数据协定描述。在WCF中,自定义类若没有指定Namespace,被序列化后默认指定为该类所在namespace,若是想手动添加XML命名空间,只需添加DataContract的Namespace属性即可。

    举例来说,对于下面的WebService,如果类MyClass1, MyClass2, SubClass没有指定XML命名空间,都默认都是“http://tempuri.org/”,当然在本例中,是给类SubClass添加XML属性描述,同样,如果不给SubClass添加XML描述,而给MyClass1, MyClass2指定不同命名空间可以达到相同效果。 而对于WCF来说,假设下面代码是WCF程序,即使不给任何一个类添加Namespace属性,也不会产生冲突,因为对于WebService2.MyClass1下的类MyClass1和SubClass的序列化后的targetNamespace为"http://schemas.datacontract.org/2004/07/WebService2.MyClass1",而WebService2.MyClass2下的类MyClass2和SubClass的系列化后的targetNamespace为"http://schemas.datacontract.org/2004/07/WebService2.MyClass2",因此两个SubClass不会产生冲突。

    在需要进行区别的类前加 XMLRoot 和 XMLType属性

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Services;
    
    using WebService2.MyClass1;
    using WebService2.MyClass2;
    
    namespace WebService2
    {
        /// <summary>
        /// Service1 的摘要说明
        /// </summary>
        [WebService(Namespace = "http://tempuri.org/")]
        [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
        [System.ComponentModel.ToolboxItem(false)]
        // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。
        // [System.Web.Script.Services.ScriptService]
        public class Service1 : System.Web.Services.WebService
        {
            [WebMethod]
            public string HelloWorld()
            {
                return "Hello World";
            }
    
            [WebMethod]
            public MyClass2.MyClass2 MyMethod(MyClass1.MyClass1 myClass1)
            {
                return new MyClass2.MyClass2(); ;
            }
        }
    }


    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Xml.Serialization;
    
    namespace WebService2.MyClass1
    {
        public class MyClass1
        {
            public string class1Name;
    
            public SubClass subClass;
        }
        [XmlType(Namespace = "http://tempuri.org/MyClass1")]
        [XmlRoot(Namespace = "http://tempuri.org/MyClass1")]
        public class SubClass
        {
            public int age;
        }
    }

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Xml.Serialization;
    
    namespace WebService2.MyClass2
    {
        public class MyClass2
        {
            public string class2Name;
    
            public SubClass subClass;
        }
    
        [XmlType(Namespace = "http://tempuri.org/MyClass2")]
        [XmlRoot(Namespace = "http://tempuri.org/MyClass2")]
        public class SubClass
        {
            public string name;
        }
    }

    其他更多内容参看:

    http://bbs.csdn.net/topics/390830565?page=1

    http://msdn.microsoft.com/en-us/magazine/cc164122.aspx

    展开全文
  • webService 服务端:加入命名空间+端口 interface接口: @WebService(targetNamespace="http://msgIdMatch.ws.webservice.common.monitor.adc.taiji.com/" ,  name= "MsgIDAndVersionMatchServicePortType" )...
  • webservice

    2017-08-20 16:51:10
    WebService (一)简单调用发布 1、WebService相关介绍  WebService概念介绍: Web Service, 能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互交换数据或集成。依据Web...
  • WebService入门详解

    万次阅读 多人点赞 2016-05-13 13:41:14
    1.什么是webservice先来考虑一个问题,如果我们要在自己的程序里面展示天气预报,那怎么弄?正确的做法是我们发送一个请求到一个系统,他会给我们返回来天气情况。这个就是一个webservice。天气预报系统就相当于...
  • webservice的 命名空间

    2013-04-07 18:18:21
    [WebService(Namespace = "http://gdg.com")] 请问这个 命名空间在什么时候用到。 每次添加web服务的时候 貌似还要起一个别名。 这都是啥意思啊。
  • 动态调用webservice地址(类)

    千次阅读 2017-03-29 09:21:52
    public static class WebServiceHelper { /// <summary> /// 动态调用WebService /// </summary> /// <param name="url">WebService地址</param> /// <param name="me
  • webService详细

    万次阅读 多人点赞 2019-07-11 10:28:02
    webServiceWebService概述 1.1 WebService是什么 WebService是一种跨编程语言和跨操作系统平台的远程调用技术。 Web service是一个平台独立的,低耦合的,自包含的、基于可编程的web的应用程序,可使用开放的...
  • 接上节所讲的,Silverlight可以加载外部的XML文件里面的内容,那么我们可不可以在外部XML里面配置一个WebService地址,并且以 此加载这个地址来动态加载WebService呢?这样子就可以避免当WebService地址改变的时候,...
  • WebService注解

    千次阅读 2017-05-27 17:35:45
    targetNamespace:指定命名空间 name:portType的名称 portName:port的名称 serviceName:服务名称 endpointInterface:SEI接口地址,如果一个服务类实现了多个接口,只需要发布一个接口的方法,可通过此注解...
  • 我用C#写了一个webservice,客户端是用java写的,我收到客户端的请求后,响应报文 中是soap命名空间的,但客户端要求返回命名空间为soapenv,请问C# webservice该如 何实现?
  • WebService 入门

    2019-05-22 15:44:16
    WebService 可以将应用程序转换为 Web 应用程序。通过 Web 进行发布、查找和使用。 基本的 WebService 平台是 XML + HTTP。 WebService 遵循 SOAP 协议通过 XML 封装数据,然后由 HTTP 协议来传输数据。
  • WebService详解

    千次阅读 2015-07-14 21:39:36
    1、WebService详解 2、jdk发布WebService 3、cxf发布WebService 4、客户端调用

空空如也

空空如也

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

webservice空间地址