怎么用java 实现两个web service之间调用各自的接口 实现数据的传输(倾家荡产给分求答案)
项目要求创建一个web service(使用java语言,axis来实现) 和远程的一个web service实现数据传输
对方用什么语言未知,也不重要。
已经写好了web service的4个接口提供给对方调用,后台业务逻辑也完成,能发布到tomcat上。
在地址栏输入http://loaclhost/axis/****.jws?wsdl 能正常显示 XML格式的网页。
现在的问题是测试的时候 不明白另一个web service该用什么方式给我的接口传递参数数据,让我完成逻辑处理后返回数据。
也就是想知道两个web service之间怎么调用对方的接口 传递参数。
希望有朋友能帮忙!! 万分感谢。。。
[解决办法]
你的WebService只要发布出去,并且对应的业务逻辑编写完成了,调用是对方的事情。
比如你现在要自己写一个程序来测试你的接口是不是能够正常工作,可以先把发布好的WSDL保存到一个文件中,命名为WSDL,然后使用axis自带的WSDL2JAVA把他转换成对应的java类,一般情况下,这些类中有一个以porttype结尾,这个类可以看做你要调用的对象类,把这些生成的代码放到你的工程里边(或者打包依赖)。
比如:
我把一个public String getName(String id)的方法,发布成了WebService,将生成的WSDL通过
java -cp axis.jar;commons-discovery-0.2.jar;commons-logging-1.0.4.jar;jaxrpc.jar;log4j-1.2.8.jar;saaj.jar;wsdl4j-1.5.1.jar org.apache.axis.wsdl.WSDL2Java GetUserNameService.wsdl
生成的类如下
GetUserNameService.java
GetUserNameServiceHttpBindingStub.java
GetUserNameServiceLocator.java
GetUserNameServicePortType.java
在你的代码中这样调用服务
GetUserNameService locator = new GetUserNameServiceLocator(new URL("WSDL的地址"));
GetUserNameServicePortType service = locator.getGetUserNameServiceHttpPort();
service.getName("1");//业务方法
[解决办法]
首先,webservice是被动的被别人调用,本身无行为能力,如果要达到楼主的效果,必须有个触发的行为。
比如,A和B都各自部署完毕,你所需要的是,启动一个行为C,C调用webserviceA, A被调用的行为内再调用B,
反之要B调用A也是如此。他们本身不会触发,必须有个另外的行为。
[解决办法]
lz可能是想问我们在进行基于web服务的开发时,当调用web服务方法一般传递什么类型的参数,以及web服务的业务逻辑完成后又以什么样的类型返回,即web服务方法的返回值类型。可是目前大家一般在举例时都只是用简单java自带的类型作为参数和返回值,比如String。不过,可以肯定的是,axis能够处理复杂的自定义数据类型。
下面这篇文章讲的很好,与lz共同学习一下。
[解决办法]
11、 VB客户端代码,由于使用了自定义的数据类型,所以只能使用microsoft soap开发包的低端API,这里使用SOAP Toolkit 2.0,代码如下:
Option Explicit
Private Sub Command1_Click()
On Error GoTo ErrorHandler
Dim Serializer As SoapSerializer
Dim Reader As SoapReader
Dim Connector As SoapConnector
Dim Method As String
Dim Dom As MSXML2.DOMDocument30
Dim Elm As IXMLDOMElement
Method = Trim(Text2.Text)
If Method = "" Then
MsgBox "请输入方法名!"
Exit Sub
End If
Set Connector = New HttpConnector
Connector.Property("EndPointURL") = Text1.Text
'Connector.Property("SoapAction") = BASE_SOAP_ACTION_URI & Method
Connector.BeginMessage
Set Serializer = New SoapSerializer
Serializer.Init Connector.InputStream
Serializer.startEnvelope
Serializer.startBody
Serializer.startElement Method, "", "", ""
'方法的参数
Serializer.startElement "address"
Serializer.writeString "dalian"
Serializer.endElement
Serializer.startElement "aouthor"
Serializer.writeString "neusoft"
Serializer.endElement
Serializer.endElement
Serializer.endBody
Serializer.endEnvelope
Connector.EndMessage
Set Reader = New SoapReader
Reader.Load Connector.OutputStream
If Not Reader.Fault Is Nothing Then
MsgBox Reader.faultstring.Text, vbExclamation
Else
Text3.Text = Reader.Dom.xml
End If
Exit Sub
ErrorHandler:
MsgBox "ERROR: " & Err.Description, vbExclamation
Err.Clear
Exit Sub
End Sub
Private Sub Form_Load()
Text1.Text = "http://localhost:8080/tour/services/DataServices?wsdl"
Text2.Text = ""
Text3.Text = ""
End Sub
12、 VC代码,建一个Win32 Console Application:
#include "stdafx.h"
#include <stdio.h>
#import "msxml3.dll"
using namespace MSXML2;
//根据自己机器的情况修改下面语句中指定的路径
#import "C:\Program Files\Common Files\MSSoap\Binaries\mssoap1.dll" \
exclude("IStream", "ISequentialStream", "_LARGE_INTEGER", \
"_ULARGE_INTEGER", "tagSTATSTG", "_FILETIME")
using namespace MSSOAPLib;
void axisTourClient(){
ISoapSerializERPtr Serializer;
ISoapReaderPtr Reader;
ISoapConnectorPtr Connector;
// 联接services
Connector.CreateInstance(__uuidof(HttpConnector));
Connector->Property["EndPointURL"] = "http://localhost:8080/tour/services/DataServices?wsdl";
Connector->Connect();
// Begin message
Connector->BeginMessage();
// Create the SoapSerializer
Serializer.CreateInstance(__uuidof(SoapSerializer));
// Connect the serializer to the input stream of the connector
Serializer->Init(_variant_t((IUnknown*)Connector->InputStream));
// Build the SOAP Message
Serializer->startEnvelope("","","");
Serializer->startBody("");
Serializer->startElement("buildData","","","");
//参数
Serializer->startElement("address","","","");
Serializer->writeString( "dalian");
Serializer->endElement();
Serializer->startElement("aouthor","","","");
Serializer->writeString ("neusoft");
Serializer->endElement();
Serializer->endElement();
Serializer->endBody();
Serializer->endEnvelope();
Connector->EndMessage();
Reader.CreateInstance(__uuidof(SoapReader));
Reader->Load(_variant_t((IUnknown*)Connector->OutputStream), "");
// 显示结果
printf("Response: %s\n", (const char*)Reader->DOM->xml );
}
int main(int argc, char* argv[])
{
CoInitialize(NULL);
axisTourClient();
CoUninitialize();
return 0;
}
13、 到现在为止可以说您走出Axis之旅的第一步。
[解决办法]
有位朋友说到参数问题,其实大多数web service都是把xml当作参数传递的,
因为xml能被各个语言识别,这个倒不是什么大问题。
我想补充一下 我的web service发布后是以xml格式在浏览器上打开的
那么对方肯定也是。
比如说天气预报的web service是
http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl
我的是 http://***.***.***.***/axis/MyWebService.jws?wsdl
2个网页都没有提供接收请求的窗口 ,怎样来触发他们知道我们在请求调用呢?
如果说用第3方来触发 ,那应该是个什么东西?