Ⅰ Python实现WebService接口(SOAP)
Web Service是一个[平台](https://ke..com/item/平台/1064049)独立的,低耦合的,自包含的、基于可[编程](https://ke..com/item/编程)的web的应用程序,可使用开放的[XML](https://ke..com/item/XML)([标准通用标记语言](https://ke..com/item/标准通用标记语言/6805073)下的一个子集)[标准](https://ke..com/item/标准/219665)来[描述](https://ke..com/item/描述/8928757)、发布、发现、协调和配置这些应用程序,用于开发分布式的交互操作的[应用程序](https://ke..com/item/应用程序/5985445)。 [1]
Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互交换数据或集成。依据Web Service规范实施的应用之间, 无论它们所使用的语言、 平台或内部协议是什么, 都可以相互交换数据。Web Service是自描述、 自包含的可用网络模块, 可以执行具体的业务功能。Web Service也很容易部署, 因为它们基于一些常规的产业标准以及已有的一些技术,诸如[标准通用标记语言](https://ke..com/item/标准通用标记语言/6805073)下的子集[XML](https://ke..com/item/XML)、HTTP。Web Service减少了应用接口的花费。Web Service为整个企业甚至多个组织之间的业务流程的集成提供了一雀激缓个通用机制。
**SOAP**
SOAP即[简单对象访问协议](https://ke..com/item/简单对象访问协议)(Simple Object Access Protocol),它是用于交换铅梁[XML](https://ke..com/item/XML)([标准通用标记语言](https://ke..com/item/标准通用标记语言)下的一个子集)编码信息的轻量级协议。它有三个主要方面:XML-envelope为描述信息内容和如何处理内容定义了框架,将程序对象编码成为XML对象的规则,执行[远程过程调用顷模](https://ke..com/item/远程过程调用)(RPC)的约定。SOAP可以运行在任何其他[传输协议](https://ke..com/item/传输协议)上。例如,你可以使用 SMTP,即因特网[电子邮件协议](https://ke..com/item/电子邮件协议)来传递SOAP消息,这可是很有诱惑力的。在[传输层](https://ke..com/item/传输层)之间的头是不同的,但XML有效负载保持相同。
Web Service 希望实现不同的系统之间能够用“[软件](https://ke..com/item/软件)-软件对话”的方式相互调用,打破了软件应用、网站和各种设备之间的格格不入的状态,实现“基于Web无缝集成”的目标。
使用Python实现服务端
service.py 服务端启动文件
app.py webservice接口
使用Python实现客户端
client.py
上面调用的客户端接口,测试结果如下:
Ⅱ webservice接口密钥是什么
1.1.1 验证码加密
接口中的验证码参数,均需要通过DES + BASE64加密,
1.1.2 报文签名
通票平台接入端分配一个cp_code和csecret
,双方均采用如下规则对报文进行签名:
l 第一步:签名源串构造规则:将请求参数按照如下规则组织“a=x&b=y&c=z&……”,每一个参数按参数名的自然数序排列。(按字典序排列)
l 第二步:使用HMAC-SHA1加密算法,将Step1中的到的源串以及实现分缺带配哪困的密钥(csecret )进行加密;
l 第三步:将Step2中得到的加密字串进行Base64编码。
签名密钥(secret):abcdefghijklmnopqrstuvwx
/**
* 返李扮念回签名之后的JSON对象
*
* @param json原JSON对象
* @param secret密钥
* @return
* @throws Exception
*/
publicstatic String doSign(JSONObjectjson,String secret) throws Exception {
String baseStr = "";
for (Object key : newTreeSet(json.keySet())) {
baseStr += ("&" + key + "=" + json.get(key));
}
SecretKeySpec key = newSecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA1");
Mac mac = Mac.getInstance("HmacSHA1");
mac.init(key);
byte[] bytes = mac.doFinal(baseStr.substring(1).getBytes("UTF-8"));
json.put("signature", new String(Base64.encodeBase64(bytes)));
return json.toString();
}
Ⅲ JAVA调用C语言发布的webservice接口
Java调用WebService可以直接使用Apache提供的axis.jar自己编写代码,或者利用Eclipse自动生成WebService Client代码,利用其中的Proxy类进行调用。理论上是一样的,只不过用Eclipse自动生成代码省事些。
1、编写代码方式:
packagecom.yun.test;
importjava.rmi.RemoteException;
importorg.apache.axis.client.Call;
importorg.apache.axis.client.Service;
importorg.apache.axis.message.PrefixedQName;
importorg.apache.axis.message.SOAPHeaderElement;
importcom.cezanne.golden.user.Exception;
importcom.cezanne.golden.user.UserManagerServiceProxy;
importjavax.xml.namespace.QName;
importjava.net.MalformedURLException;
importjavax.xml.rpc.ServiceException;
importjavax.xml.soap.Name;
importjavax.xml.soap.SOAPException;
publicclasstestWebService{
publicstaticStringgetResult()throwsServiceException,MalformedURLException,RemoteException,SOAPException
{
//标识WebService的具体路径
Stringendpoint="WebService服务地址";
//创建Service实例
Serviceservice=newService();
//通过Service实例创建Call的实例
Callcall=(Call)service.createCall();
//将WebService的服务路径加入到call实例之中.
call.setTargetEndpointAddress(newjava.net.URL(endpoint));//为Call设置服务的位置
//由于需要认证,故需要设置调用的SOAP头信息。
NameheaderName=newPrefixedQName(newQName("发布的wsdl里的targetNamespace里的url","string_itemName"));
org.apache.axis.message.SOAPHeaderElementheader=newSOAPHeaderElement(headerName);
header.addTextNode("blablabla");
call.addHeader(header);
//=newSOAPHeaderElement("发布的wsdl里的targetNamespace里的url","SoapHeader");
//soapHeaderElement.setNamespaceURI("发布的wsdl里的targetNamespace里的url");
//try
//{
//soapHeaderElement.addChildElement("string_itemName").setValue("blablabla");
//}
//catch(SOAPExceptione)
//{
//e.printStackTrace();
//}
//call.addHeader(soapHeaderElement);
//调用WebService的方法
org.apache.axis.description.OperationDescoper;
org.apache.axis.description.ParameterDescparam;
oper=neworg.apache.axis.description.OperationDesc();
oper.setName("opName");
param=neworg.apache.axis.description.ParameterDesc(newjavax.xml.namespace.QName("","arg0"),org.apache.axis.description.ParameterDesc.IN,newjavax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema","string"),java.lang.String.class,false,false);
param.setOmittable(true);
oper.addParameter(param);
param=neworg.apache.axis.description.ParameterDesc(newjavax.xml.namespace.QName("","arg1"),org.apache.axis.description.ParameterDesc.IN,newjavax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema","string"),java.lang.String.class,false,false);
param.setOmittable(true);
oper.addParameter(param);
param=neworg.apache.axis.description.ParameterDesc(newjavax.xml.namespace.QName("","arg2"),org.apache.axis.description.ParameterDesc.IN,newjavax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema","string"),java.lang.String.class,false,false);
param.setOmittable(true);
oper.addParameter(param);
oper.setReturnType(newjavax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema","string"));
oper.setReturnClass(java.lang.String.class);
oper.setReturnQName(newjavax.xml.namespace.QName("","return"));
oper.setStyle(org.apache.axis.constants.Style.WRAPPED);
oper.setUse(org.apache.axis.constants.Use.LITERAL);
oper.addFault(neworg.apache.axis.description.FaultDesc(
newjavax.xml.namespace.QName("发布的wsdl里的targetNamespace里的url","Exception"),
"Exception",
newjavax.xml.namespace.QName("发布的wsdl里的targetNamespace里的url","Exception"),
true
));
call.setOperation(oper);
call.setOperationName(newjavax.xml.namespace.QName("发布的wsdl里的targetNamespace里的url","opName"));
//调用WebService,传入参数
Stringres=(String)call.invoke(newObject[]("arg0","arg1"));
System.out.println("===============");
returnres;
}
/**
*@paramargs
*/
publicstaticvoidmain(String[]args){
try{
System.out.println(getResult());
}catch(MalformedURLExceptione){
e.printStackTrace();
}catch(RemoteExceptione){
e.printStackTrace();
}catch(ServiceExceptione){
e.printStackTrace();
}catch(SOAPExceptione){
e.printStackTrace();
}
}
}
2、利用Eclipse自动生成WebService client代码就容易多了:
首先,new project,选择other,在输入框中输入Web Service Client,选中搜索后的结果,点击Next,在Service definition中输入 WebService的发布地址,点击Finish
这样,WebService Client代码已经生成好了。
接下来写一个Test类,在main函数中输入如下代码:
Stringendpoint="服务器的WebService的地址";
YourWebServiceNameProxyumsp=newYourWebServiceNameProxy(endpoint);
try{
StringresultStr=umsp.opMethod("arg0","arg1");
System.out.println(resultStr);
}catch(Exceptione){
System.out.println("异常");
e.printStackTrace();
}catch(RemoteExceptione){
System.out.println("RemoteException异常");
e.printStackTrace();
}
Ⅳ webservice接口怎么写
建议您这边使用 xfire的动态调用要比较灵活一些。
1、找齐xfire中jar包。
2、弄个main方法,编写下面几句代码:
import org.codehaus.xfire.client.Client;
Client c = new Client(new URL("别人给的地址?WSDL"));
Object[] o = c.invoke("地址中的方法名", new Object[]{参数数组});
System.out.println(o[0].toString());
jar包的话 可以到eclipse中的类库中去找
如果 webservice中 不传递自定义的 bean 上面的代码就足够了。
Ⅳ 如何解决WebService参数传递中文乱码问题
很多人在调用WebService所提供方法的时候,发现如果当字符串中含有中文,传到WebService端就发现是乱码,这是由于WebService默认的编码是UTF-8
,当调用端和接收端用不同编码进行转换的时候,就会出现此类问题,如何解决这类问题呢,具体要根据你的环境而定。如果WebService的代码是你可控的,那么修改起来很简单,只需要把WebService工程中的web.config文件进行修改,即把使用到utf-8地方改成gb2312就行了。如果WebService的代码是你不可控的,即你无法去修改WebService工程中的web.config文件,那么做起来就比较费事了,就是你需要亲自把当前字符串转换成UTF-8的编码,具体如下:///<summary///Change string from default encoding to UTF-8 encoding///</summary///<param name=sValue
the string to be changed</param///<returns
if changed successfully, return string under UTF-8 encoding;///
else return null///</(stringsValue ){
Encoding def = Encoding.Default;
Encoding unicode = Encoding.UTF8;
// Check whether default encoding is same as UTF-8 encodingif( def == unicode )returnsValue;
// Check parameterif( sValue ==null|| sValue.Length == 0 )returnsValue;
// Convert the string into a byte[].byte[] defBytes = def.GetBytes( sValue );
// Perform the conversion from one encoding to the other.byte[] unicodeBytes = Encoding.Convert( def, unicode, defBytes);char[] uniChars =newchar[ unicodeBytes.Length] ;for(inti = 0; i < unicodeBytes.Length; i++ )
uniChars[i] = (char)(unicodeBytes[i]);returnnewstring( uniChars );}那么调用WebService之前,需要把含有中文的字符串用以上的函数进行转换,然后用转换后的字符串去调用WebService
,就可以避免在WebService中出现乱码现象。
Ⅵ 怎么规范的开发webservice接口
以下是操作步骤:
1、编写服务代码
服务代码提供了两个函数,分别为sayHello和sayHelloToPerson,在HelloService.java类中
2、发布WebService
要将上边写的HelloService类发布为WebService,需要先搭建Web应用。下面是在Tomcat下使用Axis创建WebService服务的例子。
3、在Tomcat下创建Web应用
在该例子中,在Tomcat下创建了一个context path为test_webservice的WEB应用。
(1) 在Tomcat的webapps下创建如下文件系统
test_webservice
WEB-INF
lib
Classes
(2)在WEB-INF文件夹下创建web.xml文件,在web.xml中主要是配置axis。
4、复制axis相关的jar文件
将axis的相关jar文件复制到WEB-INF\lib文件夹下。这些文件包括:
activation.jar
axis.jar
axis-ant.jar
axis-schema.jar
commons-discovery-0.2.jar
commons-logging-1.0.4.jar
jaxrpc.jar
log4j-1.2.8.jar
mailapi.jar
saaj.jar
wsdl4j-1.5.1.jar
xmlsec-1.3.0.jar
5、测试发布的WEB应用
启动Tomcat服务,打开IE浏览器,访问http:host:port/test_webservice/services,
如果看到如下界面就说明AXIS部署成功了。
6、发布WebService
发布WebService需要使用现有的AdminService来实现,这里我写了一个批处理文件来发布WebService,以后如果需要发布其他文件,只需要修改相应的参数就可以了。
(1)创建deploy.wsdd文件。
(2)创建发布WebService服务的批处理文件deploywebservice.bat。
其中E:\workspace\Libwebservice是存放axis对应的jar文件的文件夹,现在将所有的jar文件都加入到此文件夹中。
-l后的参数是本地要发布WebService的AdminService对应的访问地址。
最后deploy.wsdd是对应的配置文件名称。
(3) 将deploy.wsdd文件和deploywebservice.bat文件复制到同一个文件夹下,执行deploywebservice.bat批处理文件,就可以将deploy.wsdd中描述的Java类发布为WebService。发布完成之后再访问http://host:port/test_webservice/services
Ⅶ java编写一个webservice接口,接口中的方法参数应该是什么,返回值呢(急)要求见补充,谢谢啦
private JaxWsProxyFactoryBean getProxyFactory(Class<?> clazz,String address){
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.setServiceClass(clazz);
factory.setAddress(address);
return factory;
}
public void save(){
JaxWsProxyFactoryBean factory = getProxyFactory(ProgramVerWebService.class, PROGRAM_VER_WEB_SERVICE_ADDRESS);
ProgramVerWebService service = (ProgramVerWebService)factory.create();
String result = service.getEmpByAccount("abc");
System.out.println(result);
}
本地建立接口,如ProgramVerWebService,然后建立factory调用即可,这里用的是cxf
也可以用axis2通过解析wsdl文件来直接生成本地代码,调用如下:
stub = new ();
GetEmpByAccountE e = new GetEmpByAccountE();
GetEmpByAccount request = new GetEmpByAccount();
request.setArg0("abc");
e.setGetEmpByAccount(request);
String result = stub.getEmpByAccount(e).getGetEmpByAccountResponse().get_return();
System.out.println(result);