首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2EE开发 >

如何用java 实现两个web service之间调用各自的接口 实现数据的传输(倾家荡产给分求答案)

2012-02-04 
怎么用java 实现两个web service之间调用各自的接口 实现数据的传输(倾家荡产给分求答案)项目要求创建一个

怎么用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方来触发 ,那应该是个什么东西? 

热点排行