WEBSERVICE发布与调用

一.背景说明

最近在做一个任务,主要目的就是将客户SAP系统里的RFC函数发布成WebService,并在我们的前置机程序里面调用,得到返回的数据并经过解析处理后按照和原有逻辑类似的方式去处理。

二.具体操作

可以知道问题的关键在于WebService的发布与调用。因为之前在EBS系统里面部署配置过Intergrated soa gateway,并发布过Webservice接口。所以对相关概念有一定的了解,这次正好趁这个机会,算是重新加深一波理解了。这里主要记录下,过程中了解到的一些相关的东西以及问题。本文暂时只讨论soap协议的webservice。

2.1 Webservice发布

SAP里的Webservice发布可以参考: http://www.cnblogs.com/zohoo/p/7295920.html
对比来说,可能是因为EBS版本问题,感觉比EBS里的Webservice发布要简单,因为至少不用再去自己部署集成soa网关了,也就不用再去自己打一些相关的数据库及应用补丁了。但是因为这个工作主要由公司的SAP顾问完成,他们没弄好,我这边不可能一直干等着啊,所以先简略的用Java发布个Webservice以用于调用测试,再对比来说,Java直接发布Webservice比SAP里更加的简单,方式有很多,尽量用简单的。主要就两个注解:类上加上@WebService,要发布的方法上加上@WebMethod。具体参考:
https://www.cnblogs.com/redjh/p/6841665.html

2.2 Webservice调用

Java里关于Webservice的调用方式也是很多。这里只说我用到的几个,其他的如什么CXF,wsimport等需要用到的时候再细说。关键是在于从他们之中提取共同点,这些才是最基础最重要的东西。也就是所谓的Webservice三要素:WSDL,SOAP,UUDI,另外还有我们永远绕不开的HTTP。但我们这里概念先不去细说,有需要可以去搜索了解下,还是先看看用法。
(1). 使用axis2的wsdl2java直接生成调用类
wsdl2java -uri ./gen_wsdl/zws_apdoc1.wsdl -p com.zqx.test -o feedback
这种方式其实类似于wsimport,这里的uri可以是本地也可以是远程wsdl地址,-p 指定包名,- o指定生成代码路径。以上命令可能会给你生成类似于这样的两个java文件:

调用方式可能就是类似于下面这样。这也是我要说的这种方式的问题所在了,你必须找到你wsdl里面定义的传入传出参数类型和他生成的类里面的什么对应,这样才好去调用这个service获得response。好处在于,如果你足够熟练的话,可以按自己的需要去重写生成的类以满足自己的需求,比如在调用过程中加一些写日志的代码,以方便出问题时好调试定位错误。

    //服务
    ZWS_APDOC1Stub service = new ZWS_APDOC1Stub();
    //参数
    ZWS_APDOC1Stub.ZhscfApdocE params = new ZWS_APDOC1Stub.ZhscfApdocE();
    ZWS_APDOC1Stub.Date10 arg0 = new ZWS_APDOC1Stub.Date10();
    arg0.setDate10("2015-02-01");
    ZWS_APDOC1Stub.Numeric2 arg1 = new ZWS_APDOC1Stub.Numeric2();
    arg1.setNumeric2("7");
    ZWS_APDOC1Stub.TableOfZhscfApdoc arg2 = new ZWS_APDOC1Stub.TableOfZhscfApdoc();
    //arg2.setItem();
    params.setIDate(arg0);
    params.setIDays(arg1);
    params.setTHead(arg2);
    ZWS_APDOC1Stub.ZhscfApdocResponse response = service.zhscfApdoc(params);
    ZWS_APDOC1Stub.ZhscfApdoc[] items = response.getTHead().getItem();

    System.out.println(":"+ JSONObject.toJSONString(response));

    for (int i = 0; i <items.length ; i++) {
        System.out.println(i+":"+ JSONObject.toJSONString(items[i]));
    }
   

(2). 使用HttpURLConnection直接调用
这个在.NET里类似的东西好像叫做HttpWebRequest,不同的平台不同叫法,本质其实还是一样的东西。这种方式就相对原始了,但不知道为什么,可能是从C语言里养成的习惯,天生对这种东西有莫名的好感。因为尽管可能繁琐一点,但不用被所谓的”框架”遮蔽双眼了,各有利弊吧。使用方式可能就类似于这样:

public static String doPost(String url, String params) {
    try {
        HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
        conn.setRequestMethod("POST");
        conn.setDoOutput(true);
        conn.setDoInput(true);
        // 超时时间30秒
        int timeout = 30 * 1000;
        conn.setConnectTimeout(timeout);
        conn.setReadTimeout(timeout);
        //add by zhuqingxin <begin>
        //conn.setRequestProperty("Content-Type","text/xml");
        conn.setRequestProperty("Content-Type","text/xml; charset=UTF-8");
        //conn.setRequestProperty("Content-Type","application/json; charset=UTF-8");
        //add by zhuqingxin <end>
        conn.connect();
        if (params != null) {
            OutputStreamWriter out = new OutputStreamWriter(conn.getOutputStream(), CHARSET_NAME);
            out.write(params);
            out.flush();
            out.close();
        }
        InputStreamReader r = new InputStreamReader(conn.getInputStream(), CHARSET_NAME);
        BufferedReader reader = new BufferedReader(r);
        String line;
        StringBuffer sb = new StringBuffer();
        while ((line = reader.readLine()) != null) {
            sb.append(line);
        }
        return sb.toString();
    } catch (IOException e) {
        return null;
    }
}

注意下这里的url可以就是我们的wsdl链接,但是params参数需要是一个完整的soap请求报文,怎么获得这个报文呢?如果你足够熟悉wsdl,可以直接用字符串拼接的方式去构造,不熟的话就可以用工具帮你自动生成了,比如有个叫storm的软件,或者用我们最常用的soapUI:

(3). 使用axis的rpc调用方式
以前我一直觉得,至少在Java里,这种方式是最简单方便的。自从经历了这次的问题之后,我才发现以前的想法还是太简单,了解的东西还是太浅薄。这个后面说,依旧还是先看看用法:

 private static void testhello() throws Exception{
    String endpoint = "http://localhost:9000/hello?wsdl";
    String namespace = "http://zqx.com/";
    // 直接引用远程的wsdl文件
    // 以下都是套路
    Service service = new Service();
    Call call = (Call) service.createCall();
    call.setTargetEndpointAddress(endpoint);
    // WSDL里面描述的接口名称(要调用的方法)
    call.setOperationName(new QName(namespace,"sayHello"));
    call.addParameter("arg0", XMLType.XSD_STRING, ParameterMode.IN);// 接口的参数
    call.setReturnType(XMLType.XSD_STRING);// 设置返回类型
    call.setEncodingStyle(namespace);
    String result = (String )call.invoke(new Object[]{"测试人员"});
    System.out.println(result);

}           

三. 参考

https://blog.csdn.net/qq_31763083/article/details/53812208
https://blog.csdn.net/menghuanzhiming/article/details/78489527
https://bbs.csdn.net/topics/392013286
https://www.cnblogs.com/luoxf/p/5881970.html
https://blog.csdn.net/sisierda/article/details/52998888
http://tieba.baidu.com/p/1913611121

原文地址:https://www.cnblogs.com/zhuqingxin/p/9866740.html

时间: 2024-11-05 04:08:02

WEBSERVICE发布与调用的相关文章

Apache CXF实现WebService发布和调用

第一种方法:不用导入cxf jars 服务端: 1. 新建Web工程 2.新建接口和实现类.测试类 目录结构图如下: 接口代码: package com.cxf.spring.service; import javax.jws.WebMethod; import javax.jws.WebService; @WebService public interface IGreetingService { @WebMethod public String greeting(String name);

WebService的创建,发布与调用

创建WebService vs2015新建项目:ASP.Net 空项目 在项目中添加Web服务如下图: 创建WebHello服务代码,完成加.减.乘.除的运算 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using System.Web.Services; 6 7 namespace WebDemo01 8 { 9 /// <summary> 10

Axis2发布webservice(4)&mdash;webservice的异步调用

一,发布一个webservice,代码如下 package com.hoo.service; public class AsynchronousService { public String execute() throws InterruptedException{ //让当前线程睡眠5钟,展示异步调用 Thread.sleep(5000); return "done"; } } 二.发布Service,参见前面教程,不多讲 三.RPC方式异步调用: import java.io.I

java中使用axis发布和调用webService

工作中需要调用webService服务,这里记录一下如何在java中发布和调用webService. 需要的jar包: 发布webService: package com.xzh.webservice; import javax.jws.WebMethod; import javax.jws.WebService; import javax.xml.ws.Endpoint; @WebService public class MyWebService { public String hello(S

python发布及调用基于SOAP的webservice

现如今面向服务(SOA)的架构设计已经成为主流,把公用的服务打包成一个个webservice供各方调用是一种非常常用的做法,而应用最广泛的则是基于SOAP协议和wsdl的webservice.本文讲解python环境下如何发布及调用一个基于SOAP的webservice,基于soaplib(发布)和suds(调用). OS:ubuntu 14.04  python:2.7.6 服务端: 1.安装: 服务端要使用的工具包是soaplib,遗憾的是现在也停止维护了,不过好在还能用,下载地址在http

webService的发布与调用

FM创建 首先,执行Tcode:SE37,进入函数创建界面. 在创建函数之前,先创建一个Function Group,或者使用系统中已经创建好的Function Group.自定义函数组方法如下: 执行Create Group功能后,弹出如下图所示对话框: 录入信息后,点击保存.然后返回到Function Builder界面,在Function Module文本框录入FM的名称:Z_CALCULATE,点击创建按钮,如下图所示: 点击保存按钮,进入FM编辑页面.如下图所示: 在Attribute

使用CXF发布和调用webservice之HelloWorld入门

依赖的JAR     cxf-2.2.10.jar     jetty-6.1.21.jar     jetty-util-6.1.21.jar     servlet-2_5-api.jar     wsdl4j-1.6.2.jar     XmlSchema-1.4.5.jar 创建一个普通的Java工程即可 创建webservice接口 package com.cxf.interfaces; import javax.jws.WebParam; import javax.jws.WebSe

webService总结(四)——使用axis2发布和调用webService

准备工作 Axis2 官网 http://axis.apache.org/  下载axis2相关资料 其中 axis2-1.6.2-bin.zip文件中包含了Axis2中所有的jar文件, axis2-1.6.2-war.zip文件用于将WebService发布到Web容器中.最后两个是axis2在eclipse中的插件. 大概说说这几个文件如何使用. 1.解压axis2-1.6.2-bin.zip到任意目录.然后在eclipse中按下图配置. 2.将axis2-1.6.2-war.zip文件解

webService总结(一)——使用CXF发布和调用webService(不使用Spring)

CXF和Axis2是两个比较流行的webService框架,接下来我会写几篇博客简单介绍如何使用这两种框架.首先,先简单介绍一下CXF的使用. CXF发布webService有多种方法,这里我介绍三种: 1.不使用Spring,CXF自动发布webService 2.不使用Spring,CXF手动发布webService 3.使用Spring + CXF发布webService 这篇博客以实例介绍第一种方法--不使用Spring,CXF自动发布webService. 服务端: 目录结构如下: I