java调用WebService接口调用的问题。

飞舞的锄头 2013-10-21 05:29:51

问题:“租户自带的pos系统”每销售一件商品[/color]就会把相应的销售数据存到本机的Sybase数据库。商城提供了xml数据结构,webservice交易函数让我开发个东西,实现实时地把数据传输到XX零售管理系统(结构如上图)。
小弟生手,有很多问题想请教大家:
1、“实时”这个功能怎么实现?我打算用线程来实现但觉得太耗资源。大家有什么好建议。
2、webservice的函数该怎么去调用?
3、为什么一个简单的逻辑(从数据取得数据传到销售系统),他要分三层?
...大神们,求相关资料推荐,最好是有完整实例的
...全文
1217 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
forgetsam 2013-10-28
  • 打赏
  • 举报
回复
//1、创建服务(Service) URL url = new URL(wsdlUrl); QName sname = new QName(ns,"MyServiceImplService"); Service service = Service.create(url,sname); System.out.println("--s"); //2、创建Dispatch Dispatch<SOAPMessage> dispatch = service.createDispatch(new QName(ns,"MyServiceImplPort"), SOAPMessage.class, Service.Mode.MESSAGE); 你写的应该是 对方的ServiceName 和 PortName
宁波朱超 2013-10-28
  • 打赏
  • 举报
回复
引用 31 楼 bailin710258 的回复:
[quote=引用 30 楼 zhuchao_ko 的回复:] 擦 http://180.168.105.214:8080/TTPOS/sales.asmx?WSDL 都有了 还不会啊 这个接口居然开放出来了啊 攻击 攻击 攻击
额 你又账号密码吗?[/quote] 接口的东西怎么可以公布出来呢 真是的 我随便说说 没那闲工夫 搞你的接口。
飞舞的锄头 2013-10-28
  • 打赏
  • 举报
回复
引用 30 楼 zhuchao_ko 的回复:
擦 http://180.168.105.214:8080/TTPOS/sales.asmx?WSDL 都有了 还不会啊 这个接口居然开放出来了啊 攻击 攻击 攻击
飞舞的锄头 2013-10-28
  • 打赏
  • 举报
回复
引用 30 楼 zhuchao_ko 的回复:
擦 http://180.168.105.214:8080/TTPOS/sales.asmx?WSDL 都有了 还不会啊 这个接口居然开放出来了啊 攻击 攻击 攻击
额 你又账号密码吗?
宁波朱超 2013-10-28
  • 打赏
  • 举报
回复
擦 http://180.168.105.214:8080/TTPOS/sales.asmx?WSDL 都有了 还不会啊 这个接口居然开放出来了啊 攻击 攻击 攻击
飞舞的锄头 2013-10-28
  • 打赏
  • 举报
回复
引用 28 楼 forgetsam 的回复:
有思路就自己慢慢拼吧
大神,我想问下为什么我会卡在向服务器传输soap那一步? 代码如下: wsdl地址(http://180.168.105.214:8080/TTPOS/sales.asmx?WSDL
public class TestConn {
	private String ns = "http://tempurl.org";
	private String wsdlUrl = "http://180.168.105.214:8080/TTPOS/sales.asmx?WSDL";

	@Test
	public void test01() {
		try {
			
			/**
			 * 拼接对应的soap;
			 */
			//1、创建消息工厂
			MessageFactory factory = MessageFactory.newInstance();
			//2、根据消息工厂创建SoapMessage
			SOAPMessage message = factory.createMessage();
			//3、创建SOAPPart
			SOAPPart part = message.getSOAPPart();
			//4、获取SOAPENvelope
			SOAPEnvelope envelope = part.getEnvelope();
			//5、可以通过SoapEnvelope有效的获取相应的Body和Header等信息
			SOAPBody body = envelope.getBody();
			//6、根据Qname创建相应的节点(QName就是一个带有命名空间的)
//			QName qname = new QName("http://tempurl.org", 
//					"test_a_plus_b");//<ns:add xmlns="http://java.zttc.edu.cn/webservice"/>
			QName qname= new QName(XMLConstants.NULL_NS_URI,"q0:test_a_plus_b","q0");
			SOAPBodyElement ele = body.addBodyElement(qname);
			ele.addChildElement("q0:al_value1").setValue("22");
			ele.addChildElement("q0:al_value2").setValue("33");
			//打印消息信息
			System.out.println("soap创建成功!");
			message.writeTo(System.out);
			System.out.println("\n next....");
			/**
			 * 传输soap到服务器
			 */
			//1、创建服务(Service)
			URL url = new URL(wsdlUrl);
			QName sname = new QName(ns,"MyServiceImplService");
			Service service = Service.create(url,sname);
			System.out.println("--s");
			//2、创建Dispatch
			Dispatch<SOAPMessage> dispatch = service.createDispatch(new QName(ns,"MyServiceImplPort"),
						SOAPMessage.class, Service.Mode.MESSAGE);
			
		System.out.println("d");
			//4、创建QName来指定消息中传递数据
		//	QName ename = new QName(ns,"add","nn");//<nn:add xmlns="xx"/>
			message.writeTo(System.out);
			System.out.println("\n invoking.....");
			System.out.println("p");
			//5、通过Dispatch传递消息,会返回响应消息
			SOAPMessage response = dispatch.invoke(message);
			response.writeTo(System.out);
			System.out.println();
		
			
			/**
			 * 解析返回的内容
			 */
			//将响应的消息转换为dom对象
			Document doc = response.getSOAPPart().getEnvelope().getBody().extractContentAsDocument();
			String str = doc.getElementsByTagName("addResult").item(0).getTextContent();
			System.out.println(str);
			
		} catch (SOAPException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	
forgetsam 2013-10-26
  • 打赏
  • 举报
回复
有思路就自己慢慢拼吧
zhouyusunquan 2013-10-25
  • 打赏
  • 举报
回复
int al_value1=10; int al_value2=9; String namespace ="http://tempurl.org"; String methodName ="test_a_plus_b"; String url="http://180.168.105.214:8080/TTPOS/sales.asmx"; Service service = new Service(); Call call = (Call) service.createCall(); call.setTargetEndpointAddress(new java.net.URL(url)); call.setOperationName(new QName(namespace, methodName)) call.setSOAPActionURI("http://tempurl.org/test_a_plus_b"); Object[] obj = new Object[2]; obj[0]=al_value1; obj[1]=al_value2; call.addParameter("al_value1", XMLType.XSD_INT, ParameterMode.IN); call.addParameter("al_value2",XMLType.XSD_INT, ParameterMode.IN); call.setReturnType(XMLType.XSD_INT); Object ret = call.invoke(obj); System.out.println(ret);
飞舞的锄头 2013-10-25
  • 打赏
  • 举报
回复
引用 11 楼 suiyu2008 的回复:
楼主,去这里看下,他的方法一的第2个SOURCE应该是你想要的例子。 http://www.cnblogs.com/eagle1986/archive/2012/09/03/2669699.html
谢谢你的帮助,我已经找到了解决方法正在努力中。 相关内容 请下载 http://pan.baidu.com/s/1d1ZvN
失落夏天 2013-10-25
  • 打赏
  • 举报
回复
你是在开发这个系统的 clint端么? 即使耗资源,线程结束后也就是释放了。 webservice的函数该怎么去调用? 是别人写好的吧,应该类似于网上提供的API接口吧,应该只需要发送url请求到指定的地址就可以了
forgetsam 2013-10-25
  • 打赏
  • 举报
回复
引用 10 楼 bailin710258 的回复:
[quote=引用 9 楼 forgetsam 的回复:] 直接去http://180.168.105.214:8080/TTPOS/sales.asmx?WSDL, 用工具或者人工反向生成客户端
已经生成客户端了,只有3个文件,一个java文件(包含很多内部类,50438行代码)、一个抽象类、还有个目测是抽象类。 没有一句中文注释, 现在的问题是:我不指导该怎么去调用方法向服务器发送数据?大侠方便的话指导下[/quote] 所谓的很多内部类的文件应该是xml的进参出参与Java类型之间的映射关系。 抽象类不知道,应该是个接口。 剩下一个是Service,服务调用类。
飞舞的锄头 2013-10-25
  • 打赏
  • 举报
回复
引用 26 楼 forgetsam 的回复:
[quote=引用 25 楼 bailin710258 的回复:]
这个定义了在java代码里能调用?我是这样拼的,不知道哪里错了。


第一个是PL/SQL,只能在Oracle数据库里跑。

你既然用工具生成了客户端,还拼什么字符串,直接看23楼[/quote]
生成客户端是指 根据wsdl生成java文件? 我通过wsdl生成了三个文件,三个文件都很大很难懂,我更不知道怎么调用里面的方法。拼xml至少还有思路....
forgetsam 2013-10-25
  • 打赏
  • 举报
回复
引用 25 楼 bailin710258 的回复:
这个定义了在java代码里能调用?我是这样拼的,不知道哪里错了。
第一个是PL/SQL,只能在Oracle数据库里跑。 你既然用工具生成了客户端,还拼什么字符串,直接看23楼
飞舞的锄头 2013-10-25
  • 打赏
  • 举报
回复
引用 24 楼 bailin710258 的回复:
[quote=引用 22 楼 forgetsam 的回复:]
declare
  request utl_http.req;
  response utl_http.resp;
  methodName  varchar2(99) := 'test_a_plus_b';
  rev_pack varchar2(99):='tempurl.org';
  v_prefix varchar2(99):= 'soap';
  reqxmlstr varchar2(4000):=
'<'||v_prefix||':Envelope xmlns:'||v_prefix||'="http://schemas.xmlsoap.org/soap/envelope/"
                   xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <'||v_prefix||':Body>
    <'||methodName||' xmlns="http://'||rev_pack||'" >
      <al_value1>123</al_value1> 
      <al_value2>234</al_value2>
    </'||methodName||'>
  </'||v_prefix||':Body>
</'||v_prefix||':Envelope>';
  
  WSDLURL varchar2(99) := 
  'http://180.168.105.214:8080/TTPOS/sales.asmx';
  --去掉?wdsl后的请求地址

  respxmlstr varchar2(4000):='';
  XML xmltype;
  XML1 xmltype;
  String varchar2(9999);
  begin
  request := utl_http.begin_request(WSDLURL,'POST',utl_http.HTTP_VERSION_1_1);
  utl_http.set_header(request, 'Content-Type', 'text/xml;charset=utf-8');
  utl_http.set_header(request, 'Content-Length', length(reqxmlstr));
  utl_http.write_text(request, reqxmlstr);
  response := utl_http.get_response(request);
  utl_http.read_text(response, respxmlstr);
  
  
  dbms_output.put_line('--返回--');
  dbms_output.put_line(respxmlstr);
  utl_http.end_response(response);

end;
这个定义了在java代码里能调用?我是这样拼的,不知道哪里错了。
public class TestConn {
	private String ns = "http://tempurl.org";
	private String wsdlUrl = "http://180.168.105.214:8080/TTPOS/sales.asmx?WSDL";

	@Test
	public void test01() {
		try {
			//1、创建消息工厂
			MessageFactory factory = MessageFactory.newInstance();
			//2、根据消息工厂创建SoapMessage
			SOAPMessage message = factory.createMessage();
			//3、创建SOAPPart
			SOAPPart part = message.getSOAPPart();
			//4、获取SOAPENvelope
			SOAPEnvelope envelope = part.getEnvelope();
			//5、可以通过SoapEnvelope有效的获取相应的Body和Header等信息
			SOAPBody body = envelope.getBody();
			//6、根据Qname创建相应的节点(QName就是一个带有命名空间的)
			QName qname = new QName("http://tempurl.org", 
					"test_a_plus_b");//<ns:add xmlns="http://java.zttc.edu.cn/webservice"/>
			//如果使用以下方式进行设置,会见<>转换为<和>
			//body.addBodyElement(qname).setValue("<a>1</a><b>2</b>");
			SOAPBodyElement ele = body.addBodyElement(qname);
			ele.addChildElement("al_value1").setValue("22");
			ele.addChildElement("al_value2").setValue("33");
			//打印消息信息
			message.writeTo(System.out);
		} catch (SOAPException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	
}
[/quote] 打印出来是这样,和要求的格式不一样,我也不知道怎么传到服务器
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<test_a_plus_b xmlns="http://tempurl.org">
<al_value1 xmlns="">22</al_value1>
<al_value2 xmlns="">33</al_value2>
</test_a_plus_b></soapenv:Body>
</soapenv:Envelope>
飞舞的锄头 2013-10-25
  • 打赏
  • 举报
回复
引用 22 楼 forgetsam 的回复:
declare
  request utl_http.req;
  response utl_http.resp;
  methodName  varchar2(99) := 'test_a_plus_b';
  rev_pack varchar2(99):='tempurl.org';
  v_prefix varchar2(99):= 'soap';
  reqxmlstr varchar2(4000):=
'<'||v_prefix||':Envelope xmlns:'||v_prefix||'="http://schemas.xmlsoap.org/soap/envelope/"
                   xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <'||v_prefix||':Body>
    <'||methodName||' xmlns="http://'||rev_pack||'" >
      <al_value1>123</al_value1> 
      <al_value2>234</al_value2>
    </'||methodName||'>
  </'||v_prefix||':Body>
</'||v_prefix||':Envelope>';
  
  WSDLURL varchar2(99) := 
  'http://180.168.105.214:8080/TTPOS/sales.asmx';
  --去掉?wdsl后的请求地址

  respxmlstr varchar2(4000):='';
  XML xmltype;
  XML1 xmltype;
  String varchar2(9999);
  begin
  request := utl_http.begin_request(WSDLURL,'POST',utl_http.HTTP_VERSION_1_1);
  utl_http.set_header(request, 'Content-Type', 'text/xml;charset=utf-8');
  utl_http.set_header(request, 'Content-Length', length(reqxmlstr));
  utl_http.write_text(request, reqxmlstr);
  response := utl_http.get_response(request);
  utl_http.read_text(response, respxmlstr);
  
  
  dbms_output.put_line('--返回--');
  dbms_output.put_line(respxmlstr);
  utl_http.end_response(response);

end;
这个定义了在java代码里能调用?我是这样拼的,不知道哪里错了。
public class TestConn {
	private String ns = "http://tempurl.org";
	private String wsdlUrl = "http://180.168.105.214:8080/TTPOS/sales.asmx?WSDL";

	@Test
	public void test01() {
		try {
			//1、创建消息工厂
			MessageFactory factory = MessageFactory.newInstance();
			//2、根据消息工厂创建SoapMessage
			SOAPMessage message = factory.createMessage();
			//3、创建SOAPPart
			SOAPPart part = message.getSOAPPart();
			//4、获取SOAPENvelope
			SOAPEnvelope envelope = part.getEnvelope();
			//5、可以通过SoapEnvelope有效的获取相应的Body和Header等信息
			SOAPBody body = envelope.getBody();
			//6、根据Qname创建相应的节点(QName就是一个带有命名空间的)
			QName qname = new QName("http://tempurl.org", 
					"test_a_plus_b");//<ns:add xmlns="http://java.zttc.edu.cn/webservice"/>
			//如果使用以下方式进行设置,会见<>转换为<和>
			//body.addBodyElement(qname).setValue("<a>1</a><b>2</b>");
			SOAPBodyElement ele = body.addBodyElement(qname);
			ele.addChildElement("al_value1").setValue("22");
			ele.addChildElement("al_value2").setValue("33");
			//打印消息信息
			message.writeTo(System.out);
		} catch (SOAPException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	
}
forgetsam 2013-10-25
  • 打赏
  • 举报
回复
package com.client;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.xml.ws.RequestWrapper;
import javax.xml.ws.ResponseWrapper;

@WebService(name = "salesSoap", targetNamespace = "http://tempurl.org")
public interface SalesSoap {

	@WebMethod(operationName = "test_a_plus_b", action = "http://tempurl.org/test_a_plus_b")
	@WebResult(name = "test_a_plus_bResult", targetNamespace = "http://tempurl.org")
	@RequestWrapper(localName = "test_a_plus_b", targetNamespace = "http://tempurl.org", className = "com.client.TestAPlusB")
	@ResponseWrapper(localName = "test_a_plus_bResponse", targetNamespace = "http://tempurl.org", className = "com.client.TestAPlusBResponse")
	public int testAPlusB(
			@WebParam(name = "al_value1", targetNamespace = "http://tempurl.org") int alValue1,
			@WebParam(name = "al_value2", targetNamespace = "http://tempurl.org") int alValue2);

}
package com.client;

import java.net.MalformedURLException;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
public class MyClient extends Service {


	protected MyClient(URL wsdlDocumentLocation, QName serviceName) {
		super(wsdlDocumentLocation, serviceName);
	}

	public static void main(String[] args) {
		try {
			URL url = new URL("http://180.168.105.214:8080/TTPOS/sales.asmx?wsdl");
			QName serviceName = new QName("http://tempurl.org", "sales");
			QName portName = new QName("http://tempurl.org", "salesSoap");
			MyClient mc = new MyClient(url, serviceName);
			
			SalesSoap remote = mc.getPort(portName, SalesSoap.class);
			
			System.out.println(remote.testAPlusB(123, 456));
		} catch (MalformedURLException e) {
			e.printStackTrace();
		}
	}
	
}
forgetsam 2013-10-25
  • 打赏
  • 举报
回复
declare
  request utl_http.req;
  response utl_http.resp;
  methodName  varchar2(99) := 'test_a_plus_b';
  rev_pack varchar2(99):='tempurl.org';
  v_prefix varchar2(99):= 'soap';
  reqxmlstr varchar2(4000):=
'<'||v_prefix||':Envelope xmlns:'||v_prefix||'="http://schemas.xmlsoap.org/soap/envelope/"
                   xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <'||v_prefix||':Body>
    <'||methodName||' xmlns="http://'||rev_pack||'" >
      <al_value1>123</al_value1> 
      <al_value2>234</al_value2>
    </'||methodName||'>
  </'||v_prefix||':Body>
</'||v_prefix||':Envelope>';
  
  WSDLURL varchar2(99) := 
  'http://180.168.105.214:8080/TTPOS/sales.asmx';
  --去掉?wdsl后的请求地址

  respxmlstr varchar2(4000):='';
  XML xmltype;
  XML1 xmltype;
  String varchar2(9999);
  begin
  request := utl_http.begin_request(WSDLURL,'POST',utl_http.HTTP_VERSION_1_1);
  utl_http.set_header(request, 'Content-Type', 'text/xml;charset=utf-8');
  utl_http.set_header(request, 'Content-Length', length(reqxmlstr));
  utl_http.write_text(request, reqxmlstr);
  response := utl_http.get_response(request);
  utl_http.read_text(response, respxmlstr);
  
  
  dbms_output.put_line('--返回--');
  dbms_output.put_line(respxmlstr);
  utl_http.end_response(response);

end;
飞舞的锄头 2013-10-25
  • 打赏
  • 举报
回复
引用 19 楼 forgetsam 的回复:
[quote=引用 18 楼 tanyongbing1988 的回复:] 1.你作为客户端你首先要知道别人的webservice是通过什么方式实现的例如 xfire、axis 等,这样你就通过什么方式去实现。 服务端用什么你就用什么那还用webservice?人家那边是asp/.net实现的。
引用 18 楼 tanyongbing1988 的回复:
2.调用webservice需要注意,需要你传入的参数,返回什么,你作为客户端你要问清楚需要传入什么给他们。 需要问参数还要什么webservice,都在wsdl里写着。
引用 18 楼 tanyongbing1988 的回复:
3.调用完成之后,返回的数据是什么格式的,可能是XML、List、pojo或者是简单的字符串。 需要问返回还要什么webservice,都在wsdl里写着。
--[/quote] http://180.168.105.214:8080/TTPOS/sales.asmx?WSDL帮我写个调用里面的test_a_plus_b函数的例子
飞舞的锄头 2013-10-25
  • 打赏
  • 举报
回复
引用 17 楼 zhouyusunquan 的回复:
int al_value1=10; int al_value2=9; String namespace ="http://tempurl.org"; String methodName ="test_a_plus_b"; String url="http://180.168.105.214:8080/TTPOS/sales.asmx"; Service service = new Service(); Call call = (Call) service.createCall(); call.setTargetEndpointAddress(new java.net.URL(url)); call.setOperationName(new QName(namespace, methodName)) call.setSOAPActionURI("http://tempurl.org/test_a_plus_b"); Object[] obj = new Object[2]; obj[0]=al_value1; obj[1]=al_value2; call.addParameter("al_value1", XMLType.XSD_INT, ParameterMode.IN); call.addParameter("al_value2",XMLType.XSD_INT, ParameterMode.IN); call.setReturnType(XMLType.XSD_INT); Object ret = call.invoke(obj); System.out.println(ret);
http://180.168.105.214:8080/TTPOS/sales.asmx?WSDL帮我写个调用里面的test_a_plus_b函数的例子
forgetsam 2013-10-25
  • 打赏
  • 举报
回复
引用 18 楼 tanyongbing1988 的回复:
1.你作为客户端你首先要知道别人的webservice是通过什么方式实现的例如 xfire、axis 等,这样你就通过什么方式去实现。 服务端用什么你就用什么那还用webservice?人家那边是asp/.net实现的。
引用 18 楼 tanyongbing1988 的回复:
2.调用webservice需要注意,需要你传入的参数,返回什么,你作为客户端你要问清楚需要传入什么给他们。 需要问参数还要什么webservice,都在wsdl里写着。
引用 18 楼 tanyongbing1988 的回复:
3.调用完成之后,返回的数据是什么格式的,可能是XML、List、pojo或者是简单的字符串。 需要问返回还要什么webservice,都在wsdl里写着。
--
加载更多回复(13)

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧