转 OFBIZ webservice简介

OFBIZ webservice简介

 

Opentaps(OFBiz 9.04之后)中webservice用的是AXIS2,最开始自己在网上搜了好多资料,自己拿回来测试,发现都不对。后自己再找了下AXIS的资料说,那种报错很有可能是由于两个版本不对引起的,所以就决定看看OFBiz里面用的是哪个版本,当时我彻底无语了,里面两个版本的包竟然都有,真不知道是什么意思。但是我认为应该是AXIS2,OFBiz这么与时俱进的东西,应该不太可能用06年就不更新的架包。

废话少说,直接说开发步骤吧:

一:在项目中引入AXIS2,由于AXIS2的依赖包好几个,客户端应该不需要那么多,但是以防万一,我们把AXIS2下面lib目录的所有jar包一并加入到开发工程的classpath下。

 

 

 

二:开发webservice必须知道wsdl才能比较好的。首先我们在OFBiz中打开一个service,让它能被发不成webservice。这个非常简单,在OFBiz中你只要在service定义的xml中,把要发布的service添加一个属性export=”true”,重启服务就能看到。下面以一个实例来说明:

<!--[if !supportLists]-->① <!--[endif]-->:我们找到application/order/servicedef/services.xml文件,打开找到最后一个service,这里有个自带的SOAP测试服务,我们添加一个service,export="true"加上去,最后变成:

 

方法java代码为:

 

<!--[if !supportLists]-->② <!--[endif]-->:现在只是发布了,但是我们必须要知道怎样请求才能得到这个服务,ofbiz提供了一个event来处理它,就是<handler name="soap" type="request" class="org.ofbiz.webapp.event.SOAPEventHandler"/>,要使用它,你必须把这个定义在你的controller.xml文件中,当然,如果你已经引入了<include location="component://common/webcommon/WEB-INF/common-controller.xml"/>,那么就不需要了,这个里面已经定义好了。直接使用就行了。

 

<!--[if !supportLists]-->③ <!--[endif]-->重启服务,在浏览器中输入

http://localhost:8080/ordermgr/control/SOAPServices/testSoap?wsdl,如果你看到了你刚才发布的服务,说明已经成功。如下图:

 

三:客户端编写。

客户端代码编写最主要是要知道服务端想要的是什么东西,首先我们的服务类的定义我们可以看到是需要一个输入输出,一个输入,三个输出的,也就是两个进,两个出。在wsdl中我们可以看到

 

 

说明我们需要传入的是一个map-Map形式的Model,并且salt和userid是必须的。由于我们没有设置验证信息,所以login.username和login.password是可以不需要的。直接上代码比较好一些。

在测试的时候我仅仅弄了一个很简单的例子,由于axiom比较复杂,还要详细研究下。类说明:ClientGenricValue,封装的是要传入数据的类型,键key和值。ClientUtil

package com.wx;

 

public class ClientGenericValue {

 

private String type;

private String key;

private String value;

public String getType() {

return type;

}

public void setType(String type) {

this.type = type;

}

public String getKey() {

return key;

}

public void setKey(String key) {

this.key = key;

}

public String getValue() {

return value;

}

public void setValue(String value) {

this.value = value;

}

 

 

}

 

 

package com.wx;

 

import java.util.List;

 

import org.apache.axiom.om.OMAbstractFactory;

import org.apache.axiom.om.OMElement;

import org.apache.axiom.om.OMFactory;

import org.apache.axiom.om.OMNamespace;

import org.apache.axis2.AxisFault;

import org.apache.axis2.addressing.EndpointReference;

import org.apache.axis2.client.Options;

import org.apache.axis2.client.ServiceClient;

 

public class ClientUtil {

 

private static OMFactory factory = OMAbstractFactory.getOMFactory();

private String endPoint;

private List<ClientGenericValue> valueList;

private String om;

private String serviceName;

 

public ClientUtil(String endPoint, String serviceName , String om,

List<ClientGenericValue> valueList) {

this.endPoint = endPoint;

this.serviceName = serviceName;

this.om = om;

this.valueList = valueList;

}

 

 

 

public ServiceClient createClient() throws AxisFault {

ServiceClient client = new ServiceClient();

Options options = new Options();

 

EndpointReference targetERP = new EndpointReference(endPoint); //定义目的EndpointReference,就是服务地址

options.setTo(targetERP);

options.setTimeOutInMilliSeconds(400000); //定义超时,这里可以不定义

 

client.setOptions(options);

return client;

}

 

public OMElement send() throws AxisFault{

OMNamespace ns = factory.createOMNamespace("http://ofbiz.apache.org/service/", serviceName);

OMElement root = factory.createOMElement(serviceName, ns);

 

OMElement data = factory.createOMElement("map-HashMap", null);

root.addChild(data);

for(ClientGenericValue value : valueList){

OMElement mapKey = factory.createOMElement("map-Entry", null);

 

OMElement keyElement = factory.createOMElement("map-Key", null);

OMElement keyValue = factory.createOMElement("std-String", null);

keyValue.addAttribute(factory.createOMAttribute("value", null, value.getKey()));

keyElement.addChild(keyValue);

 

 

OMElement valueElement = factory.createOMElement("map-Value", null);

OMElement valueValue = factory.createOMElement(value.getType(), null);

valueValue.addAttribute(factory.createOMAttribute("value", null, value.getValue()));

valueElement.addChild(valueValue);

 

mapKey.addChild(keyElement);

mapKey.addChild(valueElement);

 

data.addChild(mapKey);

}

System.out.println(root);

OMElement result = createClient().sendReceive(root);

return result;

}

 

 

 

public String getEndPoint() {

return endPoint;

}

 

public void setEndPoint(String endPoint) {

this.endPoint = endPoint;

}

 

}

 

package com.wx;

 

import java.util.ArrayList;

import java.util.List;

 

import org.apache.axiom.om.OMElement;

import org.apache.axis2.AxisFault;

 

public class ClientTest {

 

/**

* @param args

* @throws AxisFault

*/

public static void main(String[] args) {

String endPoint = "http://localhost:8080/ordermgr/control/SOAPServices/testSoap";

String serviceName = "testSoap";

String om = "http://ofbiz.apache.org/service/";

List<ClientGenericValue> valueList = getTestData();

 

 

ClientUtil cu = new ClientUtil(endPoint, serviceName, om, valueList);

 

try {

OMElement result = cu.send();

System.out.println("Sent Hello, got : " + result.toString());

} catch (AxisFault e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

 

}

 

public static List<ClientGenericValue> getTestData(){

List<ClientGenericValue> valueList = new ArrayList<ClientGenericValue>();

ClientGenericValue value1 = new ClientGenericValue();

value1.setType("std-String");

value1.setKey("userid");

value1.setValue("11111");

 

ClientGenericValue value2 = new ClientGenericValue();

value2.setType("std-String");

value2.setKey("salt");

value2.setValue("The power of OFBiz");

 

// ClientGenericValue value3 = new ClientGenericValue();

// value3.setType("eeval-OrderItemTypeAttr");

// value3.setKey("testing");

// value3.setValue("org.ofbiz.entity.GenericValue"); //这个可以不用填写的

 

valueList.add(value1);

valueList.add(value2);

// valueList.add(value3);

return valueList;

}

}

 

转载于:https://www.cnblogs.com/Ivan-j2ee/archive/2012/12/12/2813920.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/474793.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 1087. 字母切换(回溯)

文章目录1. 题目2. 解题1. 题目 我们用一个特殊的字符串 S 来表示一份单词列表&#xff0c;之所以能展开成为一个列表&#xff0c;是因为这个字符串 S 中存在一个叫做「选项」的概念&#xff1a; 单词中的每个字母可能只有一个选项或存在多个备选项。 如果只有一个选项&…

遍历删除_面试难题:List 如何一边遍历,一边删除?

1. 新手常犯的错误可能很多新手(包括当年的我&#xff0c;哈哈)第一时间想到的写法是下面这样的&#xff1a;public static void main(String[] args) { List platformList new ArrayList<>(); platformList.add("博客园"); platformList.add("…

Delphi下物理删除dBase数据库的*.dbf文件

{ ************************************************************ }{ }{ 数据库操作实例 …

LeetCode 1060. 有序数组中的缺失元素(二分查找)

文章目录1. 题目2. 解题2.1 一次遍历2.2 二分查找1. 题目 给出一个有序数组 A&#xff0c;数组中的每个数字都是 独一无二的&#xff0c;找出从数组最左边开始的第 K 个缺失数字。 示例 1&#xff1a; 输入&#xff1a;A [4,7,9,10], K 1 输出&#xff1a;5 解释&#xff1…

iOS代码工具箱

判断日期是不是同一天&#xff0c;不要求是小时、分钟要一样。from&#xff1a;http://www.oliverfoggin.com/nsdate-isequaltodatetounitgranularity/?utm_sourceiOSDevWeekly&utm_campaigniOS_Dev_Weekly_Issue_115&utm_mediumemail #import <Foundation/Foundat…

python天气预报官网_python 实现对天气预报官网未来一周七天的天气情况抓取

通过HTMLPaser和urlib模块对网页进行抓取并分析实现步骤&#xff1a;1、自定义MYHTMLParser类2、实例化类并访问天气预报官网3、抓取关键数据4、对数据进行切片处理并输出字典from html.parser import HTMLPaser #处理页面模块from urllib import request #访问网站模块L […

LeetCode 536. 从字符串生成二叉树(递归)

文章目录1. 题目2. 解题1. 题目 你需要从一个包括括号和整数的字符串构建一棵二叉树。 输入的字符串代表一棵二叉树。 它包括整数和随后的0&#xff0c;1或2对括号。 整数代表根的值&#xff0c;一对括号内表示同样结构的子树。 若存在左子结点&#xff0c;则从左子结点开始…

LeetCode 1062. 最长重复子串(二分查找)

文章目录1. 题目2. 解题1. 题目 给定字符串 S&#xff0c;找出最长重复子串的长度。如果不存在重复子串就返回 0。 示例 1&#xff1a; 输入&#xff1a;"abcd" 输出&#xff1a;0 解释&#xff1a;没有重复子串。示例 2&#xff1a; 输入&#xff1a;"abbaba…

测试工具的选择和使用

Parasoft白盒测试工具集 工具名支持语言环境简介JtestJava代码分析和动态类、组件测试JcontractJava实时性能监控以及分析优化C TestC,C代码分析和动态测试CodeWizardC,C代码静态分析InsureC,C实时性能监控以及分析优化.test.Net代码分析和动态测试Compuware白盒测试工具集 工具…

ios定位权限plist_iOS-info.plist 中添加定位权限

一般在项目中添加权限只需要看这一篇文章&#xff1a;https://www.jianshu.com/p/2a309504cec8 就够了&#xff0c;但是位置权限说明有点麻烦&#xff0c;现总结如下&#xff0c;方便后期使用。定位权限一般有四个&#xff1a;NSLocationWhenInUseUsageDescriptionNSLocationAl…

iOS 6 的5个新特性创建杀手级应用

下面是5个iOS 6 的新特性&#xff0c;可以根据需要集成到新的App中&#xff1a; 1. Sharing 一个新的Social 框架&#xff0c;提供了简单的接口访问用户的social media账户&#xff0c;如Twitter、Facebook和中国的微博服务等等。你可以手工处理&#xff0c;或者简单实用UIKit的…

LeetCode MySQL 1174. 即时食物配送 II

文章目录1. 题目2. 解题1. 题目 配送表: Delivery -------------------------------------- | Column Name | Type | -------------------------------------- | delivery_id | int | | customer_id | int | | o…

python的魔法_python魔法方法大全

魔法方法含义基本的魔法方法__new__(cls[, ...])1. __new__ 是在一个对象实例化的时候所调用的第一个方法2. 它的第一个参数是这个类&#xff0c;其他的参数是用来直接传递给 __init__ 方法3. __new__ 决定是否要使用该 __init__ 方法&#xff0c;因为 __new__ 可以调用其他类的…

存储过程语法

View Code 存储过程如同一门程序设计语言&#xff0c;同样包含了数据类型、流程控制、输入和输出和它自己的函数库。--------------------基本语法--------------------一.创建存储过程 create procedure sp_name() begin ......... end二.调用存储过程 1.基本语法&#xff1a…

LeetCode MySQL 1158. 市场分析 I

文章目录1. 题目2. 解题1. 题目 Table: Users ------------------------- | Column Name | Type | ------------------------- | user_id | int | | join_date | date | | favorite_brand | varchar | ------------------------- 此表主键是 user_i…

sqlite 数据量_向SQLite批量导入csv,txt数据

将csv或者txt格式的文件导入SQLite一般有两种方式&#xff1a;使用pandas.readcsv()读取后&#xff0c;用to_sql方法写入数据库使用SQLiteStudio创建表格&#xff0c;再导入数据但是这两种方法在数据量比较大的时候会非常慢&#xff0c;这里提供一种使用官网提供的SQLite.exe命…

ASP.NET MVC URL重写与优化(进阶篇)-继承RouteBase玩转URL(转)

http://www.cnblogs.com/John-Connor/archive/2012/05/03/2478821.html 引言-- 在初级篇中&#xff0c;我们介绍了如何利用基于ASP.NET MVC的Web程序中的Global文件来简单的重写路由。也介绍了它本身的局限性-依赖于路由信息中的键值对: 如果键值对中没有的值&#xff0c;我们无…

LeetCode MySQL 580. 统计各专业学生人数

文章目录1. 题目2. 解题1. 题目 一所大学有 2 个数据表&#xff0c;分别是 student 和 department &#xff0c;这两个表保存着每个专业的学生数据和院系数据。 写一个查询语句&#xff0c;查询 department 表中每个专业的学生人数 &#xff08;即使没有学生的专业也需列出&a…

python数据抓取技术与实战训练_师傅带徒弟学Python:项目实战1:网络爬虫与抓取股票数据...

本视频基于**Python 3.X版本本视频课程是第四篇第一个实战项目&#xff0c;内容包括网络爬虫技术、使用urllib爬取数据、使用Selenium爬取数据、使用正则表达式、使用BeautifulSoup库、MySQL数据库、Python访问数据库、Lambda表达式和多线程。目录&#xff1a;22.1 网络爬虫技术…

gPodder 3.4 发布,播客接收器

gPodder 3.4 修复了 Youtube 和 Vimeo 下载的问题&#xff0c;更新了 Flattr 集成&#xff0c;性能和 UI 方面的改进等。 gPodder是播客接收器&#xff0c;采用Python和PyGTK开发。它帮你管理播客RSS供稿&#xff0c;并自动下载您想要的所有的播客许多资料。如果你对某个 供稿R…