GVKun编程网logo

webService 编程(webservice编程是冷门专业吗)

23

对于想了解webService编程的读者,本文将提供新的信息,我们将详细介绍webservice编程是冷门专业吗,并且为您提供关于axis2实现webservice之使用services.xml文件发

对于想了解webService 编程的读者,本文将提供新的信息,我们将详细介绍webservice编程是冷门专业吗,并且为您提供关于axis2实现webservice之使用services.xml文件发布WebService、axis2开发WebService之实现0配置WebService、java学习笔记之webservice(四)--用Myeclipse在web项目中发布WebService、PHP使用SOAP扩展实现WebService的方法 webservice视频教程 c# webservice php webservice的有价值信息。

本文目录一览:

webService 编程(webservice编程是冷门专业吗)

webService 编程(webservice编程是冷门专业吗)

这段时间,一直都在搞 webService 编程和 socket 编程,搞的死去活来的。总算是有点了解和认识,现在作笔录:<p>一,webService源代码</p>        Nsstring *url = [Nsstring stringWithFormat:@"<?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><%@ xmlns=\"http://www.zgbeidou.cn/\"><username>%@</username><password>%@</password>
<servicepassword>YFGPS2008</servicepassword></%@></soap:Body></soap:Envelope>",type,nil,type];

 Nsstring *urlLength = [Nsstring stringWithFormat:@"%d",[url length]];

 [urlRequest addValue:@"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];

 [urlRequest addValue:urlLength forHTTPHeaderField:@"Content-Length"];

 Nsstring *SOAPAction_str = [Nsstring stringWithFormat:@"http://www.zgbeidou.cn/%@",type];

 [urlRequest addValue:SOAPAction_str forHTTPHeaderField:@"SOAPAction"];

 [urlRequest setHTTPMethod:@"POST"];

 [urlRequest setHTTPBody:[url dataUsingEncoding:NSUTF8StringEncoding]];

 //请求并接收返回的数据 

 NSURLResponse *reponse;

 NSError *error = nil;

 NSData *responseData = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:&reponse error:&error];

 NSMutableString *resultString = [[NSMutableString alloc]initWithData:responseData encoding:NSUTF8StringEncoding];

 //    NSLog(@"urlRequest = %@",resultString);

 //解析xml数据

 GdataxMLDocument *doc = [[GdataxMLDocument alloc]initWithData:responseData options:0 error:nil];

 GdataxMLElement *rootElement = [doc rootElement];
 
    NSData *data = [[rootElement stringValue]dataUsingEncoding:NSUTF8StringEncoding];

 NSArray *arr = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingallowFragments error:nil];

 NSLog(@"arr11111 = %@",arr );
 

axis2实现webservice之使用services.xml文件发布WebService

axis2实现webservice之使用services.xml文件发布WebService

       还是对教程的延伸,本来是周五要写的,但是耽搁了一下,就拖到周一了。

      Axis2实现Web Service,虽然可以将POJO类放在axis2\WEB-INF\pojo目录中直接发布成Web Service,这样做不需要进行任何配置,但这些POJO类不能在任何包中。这似乎有些不方便,为此,Axis2也允许将带包的POJO类发布成Web Service
   
先实现一个POJO类,代码如下: 

package service; public class MyService { public String getGreeting(String name) { return "您好 " + name; } public void update(String data) { System.out.println("<" + data + ">已经更新"); } }

这个类有两个方法,这两个方法都需要发布成Web Service方法。这种方式和直接放在pojo目录中的POJO类不同。要想将MyService类发布成Web Service,需要一个services.xml文件,这个文件需要放在meta-inf目录中,该文件的内容如下:

<service name="myService"> <description> Web Service例子 </description> <parameter name="ServiceClass"> service.MyService </parameter> <messageReceivers> <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"https://www.jb51.cc/tag/cme/" target="_blank">cmessageReceiver" /> <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"/> </messageReceivers> </service>

其中<service>元素用于发布Web Service,一个<service>元素只能发布一个WebService类,name属性表示WebService名,如下面的URL可以获得这个WebServiceWSDL内容:

http://localhost:8080/axis2/services/myService?wsdl (这个得等到.aar文件出来之后)

其中name属性名就是上面URL"?""/"之间的部分。

<description>元素表示当前Web Service的描述,<parameter>元素用于设置WebService的参数,在这里用于设置WebService对应的类名。在这里最值得注意的是<messageReceivers>元素,该元素用于设置处理WebService方法的处理器。例如,getGreeting方法有一个返回值,因此,需要使用可处理输入输出的RPcmessageReceiver类,而update方法没有返回值,因此,需要使用只能处理输入的RPCInOnlyMessageReceiver类。

使用这种方式发布WebService,必须打包成.aar文件,..aar文件实际上就是改变了扩展名的.jar文件。在现在建立了两个文件(这两个文件夹任意):MyService.javaservices.xml。将MyService.java编译,生成MyService.classservices.xmlMyService.class文件的位置如下:

D:\ws\service\MyService.class

D:\ws\meta-inf\services.xml

   
 windows控制台中进入ws目录,并输入如下的命令生成.aar文件(实际上,.jar文件也可以发布webservice,但axis2官方文档中建议使用.aar文件发布webservice):

jar cvf ws.aar .    jar cvf AxisTest.aar .

    如下是我测试的过程

        原来发现不管要.aar,之后还需要一个“.”,即.arr.,但是最坑爹的就是这里了,加了“.”之后还是不对啊,最后的问题居然是这个后面的点要空一格,不能紧挨着.arr


      如下成功之后的文件夹情况


    最后将ws.aar文件复制到<Tomcat安装目录>\webapps\axis2\WEB-INF\services目录中,启动Tomcat后,就可以调用这个WebService了。

      已经显示webservice发布成功了,接下来就是编写客户端进行调运了,跟前面一样,也需要wsdl2java命令去生成stub类,过程我就不多说了,之前的博客里有

如下是调用客户端的代码

package service; import org.apache.axis2.AxisFault; public class MyServiceStubClient { public static void main(String[] args) { // Todo Auto-generated method stub try { MyServiceStub mss = new MyServiceStub(); MyServiceStub.GetGreeting gg = new MyServiceStub.GetGreeting(); MyServiceStub.Update up = new MyServiceStub.Update(); gg.setName("美女"); up.setData("帅哥"); try { mss.update(up); System.out.println("美女"+mss.getGreeting(gg).get_return()); } catch (Exception e) { // Todo Auto-generated catch block e.printstacktrace(); System.out.println("发生异常"); } } catch (AxisFault e) { // Todo Auto-generated catch block e.printstacktrace(); } } }


运行结果

由于“帅哥”是在服务器端打印的,所以客户端是看不到的。

在打包arr文件的时候,发现有一个build.xml文件,这个是ant脚本中的知识,在本题中暂时不涉及,以后再介绍。

 

如果想发布多个WebService,可以使用<serviceGroup>元素,如再建立一个MyService1类,代码如下:

package service public class MyService1 { public String getName() { return "bill"; } }


services.xml文件中可以使用如下的配置代码来配置MyServiceMyService1类:

<serviceGroup> <service name="myService"> <description> Web Service例子 </description> <parameter name="ServiceClass"> service.MyService </parameter> <messageReceivers> <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"https://www.jb51.cc/tag/cme/" target="_blank">cmessageReceiver" /> <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"/> </messageReceivers> </service> <service name="myService1"> <description> Web Service例子 </description> <parameter name="ServiceClass"> service.MyService1 </parameter> <messageReceivers> <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"https://www.jb51.cc/tag/cme/" target="_blank">cmessageReceiver" /> <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"/> </messageReceivers> </service> </serviceGroup>

axis2开发WebService之实现0配置WebService

axis2开发WebService之实现0配置WebService

最近,着手学习在Java环境中开发webservice,这里采用axis2开发。 

一、 实现0配置的WebService的步骤

 1.编写一个WebService

 2.编译这个WebService

 3.将编译生成的.class文件直接复制到<Tomcat安装目录>\webapps\axis2\WEB-INF\pojo目录中。如果pojo目录不存在,则新建这个目录。为什么是pojo目录,稍后自会揭晓。

下面是一个简单的WebService

public class Axis2WebService {
	public String hello(String name) {
		return "Hello," + name + "!";
	}

	public int getNumber() {
		return new java.util.Random().nextInt();
	}

	public double add(double number1,double number2) {
		return number1 + number2;
	}
}

进行编译得到 .class 文件后执行第 3 步,启动 tomcat startup.bat) ,在浏览器中输入:  http://localhost:8080/axis2/services/listServices

会发现下面多了一个Axis2WebService服务,如下图:

 

二 、调用WebService

直接在浏览器中调用

三个方法调用示例

http://localhost:8080/axis2/services/Axis2WebService/getNumber

http://localhost:8080/axis2/services/Axis2WebService/hello?args0=(inputparameter)

http://localhost:8080/axis2/services/Axis2WebService/add?args0=0&args1=9

其中有输入参数时,参数名要和wsdl中描述一致,调用结果如下

 



使用Java调用WebService

 2.1 使用RPC调用WebService

调用步骤:

1. 创建RPCServiceClient对象

2. 创建EndPointReference对象,并指定要访问WebServiceURL(不包含wsdl

3. 创建描述WebService方法的参数值object[]对象

4. 创建描述WebService方法返回值类型的class[]对象

5. 创建QName对象,并指定要调用的WebService方法

6. 使用RPCServiceClient类的invokeBlocking方法调用WebService方法(invokeBlocking方法采用的是同步的方式)

这里写一个客户端实例来验证一下(需要先导入阿axis2\WEB-INF\lib文件下的jar包)

package cn.axis2.client;

import javax.xml.namespace.QName;

import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;
import org.junit.Test;

public class RPcclient {
	@Test
	public void test() {
		try {
			//创建RPCServiceClient对象
			RPCServiceClient rpcclient = new RPCServiceClient();
			Options options = rpcclient.getoptions();
			//创建EndPointReference对象,并指定要访问WebService的URL(
			EndpointReference endpoint = new EndpointReference(
					"http://localhost:8080/axis2/services/Axis2WebService");
			options.setTo(endpoint);
			//创建描述WebService方法的参数值object[]对象
			Object[] request = new Object[] { "2","4" };
			//创建描述WebService方法返回值类型的class[]对象
			Class[] responseType = new Class[] { double.class };
			//创建QName对象,并指定要调用的WebService方法
			QName qname = new QName("http://ws.apache.org/axis2","add");
			//使用RPCServiceClient类的invokeBlocking方法调用WebService方法
			Object[] response = rpcclient.invokeBlocking(qname,request,responseType);
			System.out.println(response[0]);
			
			response = rpcclient.invokeBlocking(new QName(
					"http://ws.apache.org/axis2","getNumber"),new Object[] {},new Class[] { int.class });//当没有输入参数时,不能用null替代new Object[]{}
			System.out.println(response[0]);
			
			response = rpcclient.invokeBlocking(new QName(
					"http://ws.apache.org/axis2","hello"),new Object[] { "boy" },new Class[] { String.class });
			System.out.println(response[0]);
		} catch (AxisFault e) {
			e.printstacktrace();
		}
	}
}

2.2wsdl2java简化客户端的编写

RPC方式调用WebService步骤多,复杂,不过axis2提供了一个更简单的方法来访问WebServiceaxis2提供一个wsdl2java命令,这个命令可以根据wsdl的内容自动生成调用WebService的客户端Stub类。

cmd命令行下进入axis2\bin目录键入命令:

wsdl2java -uri http://localhost:8080/axis2/services/Axis2WebService?wsdl -p cn.axis.client -s -0 stub

 

最后在axis2\bin目录下生成stub文件夹。

 

这个Axis2WebServiceStub.java就是客户端类。通过调用类中方法就可以访问WebService了。

创建一个java工程,将stub文件夹下的内容拷贝至工程下

package cn.axis.client;

import java.rmi.remoteexception;

import org.apache.axis2.AxisFault;
import org.junit.Test;

public class StubClient {
	@Test
	public void test() {
		try {
			// add
			Axis2WebServiceStub client = new Axis2WebServiceStub();
			Axis2WebServiceStub.Add add = new Axis2WebServiceStub.Add();
			add.setArgs0(1);
			add.setArgs1(2);
			System.out.println(client.add(add).get_return());

			// getNumber
			System.out.println(client.getNumber(
					new Axis2WebServiceStub.GetNumber()).get_return());

			// hello
			Axis2WebServiceStub.Hello hello = new Axis2WebServiceStub.Hello();
			hello.setArgs0("boy");
			System.out.println(client.hello(hello).get_return());	
		} catch (AxisFault e) {
			e.printstacktrace();
		} catch (remoteexception e) {
			e.printstacktrace();
		}
	}
}
很明显,生成客户端方式简单得多。

3动态调用WebService

动态调用WebService,最为基本,基于流的方式,灵活,不需要生成客户端类。

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.net.URLConnection;
import org.junit.Test;

public class MSPJK {
	@Test
	public void test() {
		String wsdlUrl = "http://localhost:8080/axis2/services/Axis2WebService?wsdl";
		String soap = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:axis=\"http://ws.apache.org/axis2\">"
				+ "<soapenv:Header/>"
				+ "<soapenv:Body>"
				+ "<axis:add>"
				+ "<args0>4</args0>"
				+ "<args1>5</args1>"
				+ "</axis:add>"
				+ "</soapenv:Body>" + "</soapenv:Envelope>";
		String soapAction = "http://ws.apache.org/axis2/add";
		String response = getSoapStream(wsdlUrl,soap,soapAction);
		System.out.println(response);
	}

	public String getSoapStream(String wsdlUrl,String soap,String soapAction) {
		try {
			URL url = new URL(wsdlUrl);
			URLConnection conn = url.openConnection();
			conn.setUseCaches(false);
			conn.setDoInput(true);
			conn.setDoOutput(true);

			conn.setRequestProperty("Content-Length",Integer.toString(soap.length()));
			conn.setRequestProperty("Content-Type","text/xml; charset=utf-8");
			conn.setRequestProperty("SOAPAction",soapAction);

			OutputStream os = conn.getoutputStream();
			OutputStreamWriter osw = new OutputStreamWriter(os,"utf-8");
			osw.write(soap);
			osw.flush();
			osw.close();
			StringBuilder totalString = new StringBuilder();
			String currentLine = "";
			InputStream is = conn.getInputStream();
			BufferedReader reader = new BufferedReader(new InputStreamReader(
					is));
			while ((currentLine = reader.readLine()) != null) {
				totalString.append(currentLine);
			}
			return totalString.toString();
		} catch (Exception e) {
			e.printstacktrace();
		}
		return null;
	}
}
结果:

<?xml version=''1.0'' encoding=''utf-8''?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><ns:addResponse xmlns:ns="http://ws.apache.org/axis2"><return>9.0</return></ns:addResponse></soapenv:Body></soapenv:Envelope>
对这个进行解析就可以得到结果了。

三 、WebService中使用其他的类(自定义类)

在做项目时,往往需要自定义类,所以WebService能够使用自定义类很重要。下面介绍一下怎么去实现。

假设,现在服务器端有个Person类,客户端需要直接访问得到Person信息,该怎么做。

package cn.axis2.myclass;
public class Person {
	private String name;
	private int age;

	public void setName(String name) {
		this.name = name;
	}

	public String getName() {
		return this.name;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public int getAge() {
		return this.age;
	}
}

修改Axis2WebService.java,导入Person:(import cn.axis2.myclass.Person;

并添加一个方法: 

public Person getPerson() {
	Person person = new Person();
	person.setName("dsl");
	person.setAge(21);
	return person;
}

同时编译Person.javaAxis2WebService.javaAxis2WebService.class拷贝至webapps\axis2\WEB-INF\pojo目录下,Person.class拷贝至webapps\axis2\WEB-INF\classes\cn\axis2\myclass目录下(路径与包名一致)

 

在浏览器中刷新http://localhost:8080/axis2进入Services项,可以看见多了getPerson接口。

wsdl2java命令重新生成客户端类,

//getPerson
Axis2WebServiceStub.GetPerson getPerson = new Axis2WebServiceStub.GetPerson();
System.out.println(client.getPerson(getPerson).get_return().getName());
System.out.println(client.getPerson(getPerson).get_return().getAge());

这样就可以输出Person信息了。自定义类的使用也就实现了。

四、在没有Servlet容器情况下使用axis2

对来axis2,它自身在二进制发行包中提供了一个简单的HTTP服务器,这个服务器默认端口是8080,与tomcat默认端口冲突,所以要用这个HTTP服务器,得先关闭tomcat

CMD:在axis2\bin目录下输: axis2server.bat

在浏览器中刷新http://localhost:8080/axis2/services/

可以看到axis2提供的默认服务Version


五 axis2.xml配置文件

最后讲一下axis2.xml配置文件,这是axis2的核心文件,在<Tomcat安装目录>\webapps\axis2\WEB-INF\config目录下。

其中几个常用的配置有:

<!--是否热发布,即发布服务时,不需要重新启动tomcat-->
<parameter name="hotdeployment">true</parameter>
<!--是否热更新 -->
<parameter name="hotupdate">false</parameter>
<!--配置发布WebService服务目录,使用POJODeployer类发布的WebService类不能有包,这就是为什么前面发布WebService时要放在pojo目录下-->
<deployer extension=".class" directory="pojo"/>
<!--配置HTTP服务器 -->
<transportReceiver name="http">
        <parameter name="port">8080</parameter>
</transportReceiver>

java学习笔记之webservice(四)--用Myeclipse在web项目中发布WebService

java学习笔记之webservice(四)--用Myeclipse在web项目中发布WebService

》》接上一篇


准备工作:

1、新建一个web项目;

2、定义服务的接口Speaker:

package com.beauxie.webservice;

import javax.jws.WebService;

/**
 * 定义服务的接口
 * @author  
 *
 */
@WebService//此注解用在类上指定将此类发布成一个WebService
public interface Speaker {
	
	String sayHello(String name);

}
3.创建这个接口的实现类Person:

package com.beauxie.webservice;

import javax.jws.WebService;

/**
 * 定义服务的实现类
 * @author Beauxie
 *
 */
@WebService(endpointInterface="com.beauxie.webservice.Speaker")
public class Person implements Speaker {

	public String sayHello(String name) {
		 
		return "Hello,"+name;
	}

}

主要步骤:

1.依次点击左上角的“File”-->“New”-->“other”,如下图所示:


2.选择"Web Service",点击“Next”,如下图所示:



3.点击"Install JAX-WS-Facet"安装JAX-WS-Facet,如下图所示:



4.选择自己所要发布服务的项目等,如下图所示:



5.在 Java class一栏中,选择web服务的实现类,(点击右边的Browse,直接搜索类名即可),其余的不用修改:



6.完成上述步骤以后,在WEB-INF目录下可以看到多了两个文件:“sun-jaxws.xml”和“web.xml”,然后再导入相关的jar包,不然会报错:java.lang.ClassNotFoundException: com.sun.xml.ws.transport.http.servlet.WSServletContextListener 。(点击下载相关jar包)


7.打开"web.xml",可查看配置:



8.启动web项目之后,打开浏览器,访问“web.xml”中servlet(url-pattern)对应的webservice:


出现以上界面,说明服务发布成功。


总结:

1.当出现:java.lang.ClassNotFoundException: com.sun.xml.ws.transport.http.servlet.WSServletContextListener异常时,很大原因是因为忘了导入相关jar包;

2.通过“web.xml”中对应的servlet(url-pattern)访问发布的webservice,每个人端口号不同,我这里修改了tomcat的配置文件,将默认端口改成了80。


接下一篇 》》



PHP使用SOAP扩展实现WebService的方法 webservice视频教程 c# webservice php webservice

PHP使用SOAP扩展实现WebService的方法 webservice视频教程 c# webservice php webservice

今天关于webService 编程webservice编程是冷门专业吗的分享就到这里,希望大家有所收获,若想了解更多关于axis2实现webservice之使用services.xml文件发布WebService、axis2开发WebService之实现0配置WebService、java学习笔记之webservice(四)--用Myeclipse在web项目中发布WebService、PHP使用SOAP扩展实现WebService的方法 webservice视频教程 c# webservice php webservice等相关知识,可以在本站进行查询。

本文标签: