您的位置:时时app平台注册网站 > 时时app平台注册网站 > 第二篇:利用shell脚本执行webservice请求——基于

第二篇:利用shell脚本执行webservice请求——基于

2019-11-21 02:43

3. 经历计算

Webservice接口的恳求情势有为数不菲种,能够经过框架乞请,也能够在java项目中央职能部门接基于soap央浼,还是能够像大家如此直白用shell脚本来实现诉求。区别的方法有差别的利弊,我们在实际项目中要学会灵活选拔,符合的才是最棒的。

接触webservice也有风流倜傥段时间了,为了查缺补漏,把知识点系统化,希图写几篇博文梳理下webservice的知识点,那是率先篇,对webservice实行大致的牵线。

2.3.2.1 soap音讯生成工具脚本

出于soap音讯是叁个有固定格式的xml文件,因而大家得以用工具脚本去变通。其代码如下所示:

#!/bin/bash
# filename: create_xml.sh
# create_MarsCheng_20160922
# 从外部传入的第一个参数作为xml的文件名
outfile=$1
# xml中的缩进位
tabs=0
#                             
# 组装一个节点,输出到文件
# 说一说传参数时的这几个区别:假如有下面这个脚本执行的命令
# /path/to/scriptname  opt1  opt2  opt3  opt4 
# $0: 的值是默认是脚本的名字,从$1-$4 开始就是参数的值
# $# :代表后接的参数『个数』
# $@ :代表『 "$1" "$2" "$3" "$4" 』之意,每个变量是独立的(用双引号括起来); 
# $* :代表『 "$1c$2c$3c$4" 』,其中 c 为分隔字节,默认为空白键, 所以本例中代表『 "$1 $2 $3 $4" 』之意。
# 在shell中我们可以也可以使用${}包含变量名,来调用变量
#                             
put(){
    echo '<'${*}'>' >> /tmp/sms/request/$outfile
}

# 这里也是输出一个xml的节点,只是比上面的节点有更多的设置
# ${@:3} 的意思:它的值就是由第二个参数开始到最后一个参数,为什么要这样?有时可能你的第二个参数中有空格,shell接受参数是以空格计算的
put_tag() {
    echo '<'${1}' xsi:type="'${2}'">'${@:3}'</'${1}'>' >> /tmp/sms/request/$outfile
}
# 同样是一个输出节点函数,但是添加了CDATA,防止特殊字符造成xml解析失败
put_tag_cdata() {
    echo '<'${1}' xsi:type="'${2}'"><![CDATA['${@:3}']]></'${1}'>' >> /tmp/sms/request/$outfile
}
#由于soap消息的头部一部分一般固定,因此可以直接写一个固定的方法输出
put_head(){
    echo –e “…”>> /tmp/sms/request/$outfile
}
#由于soap消息的尾部一部分一般固定,因此可以直接写一个固定的方法输出
put_end(){
    echo –e “…”>> /tmp/sms/request/$outfile
}
tag_start(){
    str=""
    str=${1}' xsi:type="'${2}'"'
    put $str
}

tag_start_array(){
    str=""
    str=${1}' q1:arrayType="'${2}'" xsi:type="q1:Array"' 
    put $str
}

tag() {
    str=""
    str=${1}' xsi:type="'${2}'" /'
    put $str
}

tag_value(){
    if [ "$1" == 0 ]
    then
        put_tag ${2} ${3} $(echo ${@:4})
    elif [ "$1" == 1 ]
    then
        put_tag_cdata ${2} ${3} $(echo ${@:4})
    fi
}

tag_end(){
    put '/'${1}
}

2.1.1概述

广义上的Web服务是叁个U奥迪Q5L财富,顾客端能够透过编制程序情势呼吁获得它的劳动,而不要求知道所须求的服务是哪些达成的,那一点与人生观的布满式组件对象模型差异。

可是现 在我们说webservice平时是指XML Web ServiceWeb瑟维斯。它是通过soap在web上提供的软件服务,用wsdl举办描述,并经过uddi实行注册。

  • XML(Extensible 马克up Language):扩充型可标志语言,用于数据的传递,是soap的根底。
  • SOAP(Simple Object Access Protocol):全称轻巧对象访谈左券,是风度翩翩种基于xml的轻量左券。当客商通过UDDI找到wsdl描述文件后,能够透过soap调用劳动的三个或七个操作。SOAP是XML文书档案情势的调用方法的正儿八经,它能够帮忙不相同的底层接口,像HTTP(S)也许SMTP。
  • WSDL(Web Services Description Language):webservice描述语言,本质是三个xml文书档案,用于表明soap音信甚至怎么着交流那些消息,日常由软件自动生成和应用。
  • UDDI(Universal Description, Discovery, and Integration):是大器晚成种目录服务,公司通过它对webservice进行注册和查找

2.3.2.3准期进行

为了让系统尤其智能化,实施脚本可以参加Linux的crontab按期任务个中。

40 10-18 * * * root sh /tmp/sms/sms_send.sh

上边表示天天10点到18点的40分,脚本都会运行叁回,因为在实施脚本中我们加了短信发送标记位,由此不要担忧短信回重复发送。

2.2webservice相关框架

webservice三个最大的表征正是与语言非亲非故,所以webservice用什么语言开采其实都足以。未来用的超多的是c#和java,这里大家根本介绍java关于webservice的开销。

java开拓web service的框架数见不鲜的有Axis,axis2,Xfire,CXF以至JWS,此中axis2和cxf是近期最棒常用的框架。axis2能够当做是三个Mini的应用服务器,相对来讲会十分重,可是它成效强大,帮助多语言,在大型项目被很多地采纳。

2. 施行进度

2.1.3调用方法

webservice除了httpsoap调用,也得以用get和post方法来调用,不过soap能够传递结构化的数码,而post和get方法充足。

在java web中,大家要调用webservice,常常是要先选择相应框架(如axis2等卡塔 尔(英语:State of Qatar)生成webservice的对应client,然后经过调用client里面包车型客车相关方法来达成对webservice的调用。

1. 档案的次序背景

早年大家在支付基于webservice的连串中,大家总习贯于间接动用webservice的一些框架,如Axis,axis2和Xfire等。框架的益处是将webservice所涉及到的soap公约、wsdl以至uddi都卷入起来,大家只必要直接调用方法传值并施行须求就足以。但框架也格外,举例axis2要基于java工程,哪怕只是三个归纳的效果与利益大家都要搭建三个java web项目去贯彻它。那样做的结果就是:

1. 占用服务器磁盘资源(一个java web项目至少也要几M);
2. 占用内存资源。特别是对那些不需要页面的项目来说,java web实在是大材小用了。

就拿本身多年来付出的短信准期发送项目为例。在此个类型里,大家只需求每一日从数据库取多少然后拼成短信,依期调用总集团的短信接口发送短信就能够了。无需别的图形分界面,作用也很纯粹,借使用java项目去做就太神经过敏了。所以大家想到八个高超的方式,直接运用webservice的最底层知识去得以达成那个成效。即间接用Linux的shell脚本生成soap新闻,然后用soap恳求webservice。

2.1.2调用原理

webservice之所以能够达成跨平台跨语言之间的调用,是因为它定义了贰个统生机勃勃的音讯相互和调用的正式。正如上文所说,webservice的贯彻内需依靠多少个至关心注重要的本领:XML,soap,wsdl和uddi。

webservice最要害的风度翩翩环正是soap,即把多少以xml的样式结合起来,然后通过http合同与远程服务实行通讯,大家把用xml组合的数额格式统风流倜傥,称为soap新闻,那就成了我们跨平台跨语言通信的主要性。

当然只好承认,soap格式的报文存在严重的冗余,并且信任定义好的xml schemas,大家假诺手动创设soap音信会特别忙绿,须要注重一些工具来简化一些办事,由此今后成千上万webservice的开法越来越趋于于restful风格的webservice。

图片 1

如图所示,一个全体的webservice进度能够包含为以下步骤:

  1. web服务提供者开荒到位劳动后通过web服务中介者发表服务,并因此服务注册宗旨(日常为UDDI卡塔尔注册(公布卡塔 尔(阿拉伯语:قطر‎
  2. web服务需要依照本身的需求向web服务中介者建议号召,web服务中介者会依赖央求在UDDI注册宗旨找到知足需求的劳务(发掘卡塔 尔(阿拉伯语:قطر‎
  3. web服务中介者会向web服务乞请者公布web服务的描述新闻,这个音讯经常是通过wsdl写成的,wsdl能够经过多数浏览器来一直阅读(开掘卡塔尔
  4. web服务央浼者依照wsdl音信编写相应的soap新闻,然后发给web服务提供者,来调用相应的web服务(绑定卡塔尔
  5. web服务提供者会依据soap音信实践相应的服务,并把调用结果发送给web服务央求者(绑定卡塔尔国

2.3.2 具体贯彻

1.2哪些是网络服务(webservice卡塔尔

如上文所说,网络服务(webservice卡塔尔正是将某风流浪漫服务通过互连网宣布并被顾客所拿到的某生龙活虎微处理器成效。如前方说的景观服务,相比较遍布的还会有Wechat公众号支付时大家得以调用的各类接口(如自行复苏、支付、识别发送的新闻项目等接口卡塔 尔(英语:State of Qatar),Tencent地图提供的地图接口,支付宝提供的付出接口等等。那个互连网服务加上我们地点的着力成效同步组成了一个完好无损的系列。

只要二个软件的基本点部分使用了"互联网服务(webservice卡塔 尔(英语:State of Qatar)",即它把仓库储存或总计环节"外包"给此外网址了,那么大家就说那几个软件归属Web Service架构。

Web 瑟维斯架构的主旨情维,即使尽恐怕把非大旨成效交由别的人去做,自个儿拼命付出基本成效。

webservice优势

  • 阳台无关。不管您利用什么平台,都足以动用Web service。

  • 编制程序语言毫无干系。只要遵从相关心下一代组织商,就足以采纳大肆编制程序语言,向任何网址供给Web service。那大大扩大了web service的适用性,裁减了对程序员的渴求。`

  • 对此Web service提供者来讲,铺排、晋级和护卫Web service都极其单纯,不供给思忖客商端宽容难题,並且一回性就能够做到。

  • 对此Web service使用者来讲,能够随意完结各个数码、多样劳动的集纳(mashup卡塔 尔(英语:State of Qatar),由此能够做出一些原先根本不可能想像的工作。

2.webservice相关本事

2.2.1 技艺介绍

在介绍实现进程在此以前大家先介绍下soap左券。Soap左券全称为simple Object Access Protocol,是多少个依据http的拜访左券,这里的simple Object指代正是soap音讯,它实质上是三个xml格式的文本,必需含有以下因素:

*   必需的 Envelope 元素,可把此 XML 文档标识为一条 SOAP 消息
*  可选的 Header 元素,包含头部信息
*   必需的 Body 元素,包含所有的调用和响应信息    
*   可选的 Fault 元素,提供有关在处理此消息所发生错误的信息

图片 2

而且soap公约还要依附POST诉求,因为post央求有body域,能够用来封装soap音讯。

Soap必要的办法有好两种,能够在框架中呼吁(后文中有介绍,直接封装在框架中,顾客即使传值就可以卡塔 尔(英语:State of Qatar)。也得以友善依据格式编写soap新闻,直接用http命令央浼,举例Linux的curl命令。相对来讲后面一个的效用会越来越高些。

1.什么是webservice

2.3.2.2现实实行脚本

切实实践央浼的脚本,在此个本子里会调用soap新闻生成工具脚本,会三回九转数据库读取短信内容,最终用curl达成soap恳求。

#统计日期,即当前日期前一天
cal_date=$(date -d -1day  %Y-%m-%d)
#短信是否发送标记,若为1则表示短信已发送,否则为0
flag=$(sqlplus -S statistic/123@tjfxdb << EOF
        set heading off feedback off pagesize 0 verify off echo off
        select flag from statistic.smsflg where calDate ='$cal_date';
        commit;
        quit;
EOF)

if [ ! -n "$flag" ];
then
#从数据库取出短信内容,存入smsinfo
smsinfo=$(sqlplus -S statistic/123@tjfxdb << EOF
        set heading off feedback off pagesize 0 verify off echo off
        select smsinfo from statistic.smsInfo where calDate =date'$cal_date' and smscode ='AHYZ' and bvalid = 1 ;
        commit;
        quit;
EOF)

if [ ! -n "$smsinfo" ]; #若短信内容为空,不发送
then
echo $(date " %Y-%m-%d %H:%M:%S")" The content is not ready.">> /tmp/sms/log/$cal_date'.log'
else
#生成soap xml文件名
file_name='request'$(date " %Y%m%d%H%M%S")'.xml'
#调用xml的生成脚本
source '/tmp/sms/create_xml.sh' $file_name
put_head

taskID=$(date " %s")
declare -i message_size=1
declare -i labels_size=4
name=('DEPTCODE' 'CUR_DATE' 'FUN_DESC' 'CONTENT')
value[0]='123456'
value[1]=$cal_date'日'
value[2]='保费达成情况'
value[3]=$smsinfo
#短信发送对象
telephone=(‘12345678')

message_str2='q2:SmsMessage['$message_size']'
label_str2='q2:Label['$labels_size']'
tag_start_array 'messages' $message_str2
declare -i j=0

#短信核心主体
while ((j<message_size))
do
    tag_start 'SmsMessage' 'q2:SmsMessage'
    tag_value 0 'packetLength' 'xsd:int' '0'
    tag_value 0 'contents' 'xsd:string' '中国人寿'
    tag_start_array 'labels' $label_str2
    declare -i i=0
    while ((i<labels_size))
    do
        tag_start 'Label' 'q2:Label'
        tag_value 0 'packetLength' 'xsd:int' '0'
        tag_value 0 'labelName' 'xsd:string' ${name[i]}
        if [ $i == 3 ]
        then
            tag_value 1 'labelValue' 'xsd:string' ${value[i]}
        else
            tag_value 0 'labelValue' 'xsd:string' ${value[i]}
        fi
        tag_end 'Label'
        let i  
    done
    tag_end 'labels'
    tag_value 0 'orgCode' 'xsd:string' '123456'
    tag_value 0 'receiver' 'xsd:string' ${telephone[j]}
    tag_end 'SmsMessage'
    let j  
done
tag_end 'messages'
tag_value 0 'taskId' 'xsd:string' $taskID
put_end

#请求webservice服务发送短信
curl -H "Content-Type: text/xml;charset=UTF-8" -H "SOAPAction: "http://WebXml.com.cn/getStockInfoByCode""  -d @/tmp/sms/request/$file_name http://Xxxxxxxxxx  >> /tmp/sms/log/$cal_date'.log'
#写短信发送标记位
sqlplus -S statistic/123@tjfxdb << EOF
        set heading off feedback off pagesize 0 verify off echo off
        insert into smsflg(caldate,flag) values('$cal_date',1);
        commit;
        quit;
EOF

分析:

curl是一个利用UENCOREL法规在指令行下职业的文件传输工具,它支持文件的上传和下载,因而在本子中大家用它来进展soap央浼。其命令格式如下。
图片 3

-H前面跟的是http央浼头,’SOAPAction’键平时用来代表这些HTTP诉求是二个web服务诉求,同不常候取值可以为空字符串,可是也能够是必要的web服务操作的称呼。

2.1webservice的落到实处原理

2.2实现流程

1.1怎么着是劳务(service卡塔 尔(阿拉伯语:قطر‎

微型机的劳动日常指的正是Computer能提供的某豆蔻梢头效用,比方qq能提供谈天服务,杀毒软件能提供杀毒服务。而普通意况大家把劳动分为两大类,分别是本地服务(本地提供,不供给通过网络获得卡塔 尔(英语:State of Qatar)和互连网服务(即webservice,需求经过互联网获取卡塔 尔(阿拉伯语:قطر‎。

接下去大家简要相比下这两种服务。

本地服务 网络服务
实现方式 利用本地资源实现,需要掌握实现方式 通过网络获取,不需要知道怎么实现
实现成本 需要自己承当人力物力,成本较高 只需要远程调用,成本较低
稳定性 自己实现,自己维护,稳定性相对较高,且不依赖互联网,断网风险小 依赖互联网,服务出现问题维护相对较麻烦,但成本不一定高
移植性 较差,换个系统要实现改服务要重新开发 较好,可以快速移植

图表的原委恐怕相比空虚,大家无妨譬如来心得下。

  • 要是大家要兑现三个天气预测的劳动,倘若我们使用地方服务,首先我们得发送三个气象卫星,然后我们还要能收到并拍卖卫星数量的设备,有了数量之后大家有特别的化学家深入分析这一个多少,然后通进度序员用图片的花样显示出来。

  • 假使大家运用网络服务,大家只须求调取气象基本的接口,就足以赢得气象服务。

  • 假使有一天大家开掘调用的接口传回的数据错乱,假诺大家是本土服务,我们当即能够协会职员逐个审查难点,但倘假使互联网服务,我们就得依据气象基本来解除难题,并且风流洒脱旦有一天互联网现身故障,大家也会见对不能够得到气象数据的难点。
  • 生机勃勃旦某天公司业务要举办,大家必要在七个新景况下促成气象服务,假使是地方服务,大家又得重新去落到实处一回。而倘若是网络服务,大家只需求把接口重新在新情形下调用就可以。

进而,大家能够开采,本地服务的兑现基金会远超过网络服务。特别是对于那一个非主题的劳动,如若大家都要事必躬亲去团结达成,无疑会大增自身的肩负。同期当地服务的移植性也不及网络服务,因而互联网服务就变成二个要命主要的前行大方向。

2.1项目深入分析

上文提到的短信项目是三个为了兑现大家企业管理办公室公室消息化的小品种。其主要效用正是天天从数据库读取总部即各支公司保费收入及职业实现景况,然后组合成短信发给各样领导以便于其靠边调节公司发展铺排。

本条连串有多少个特征:

1. 功能比较单一;
2. 不需要图形界面操作。因此我们完全可以抛开java项目,直接用shell脚本去实现。

2.3webservice今后发展倾向

  1. 通讯公约会趋向于选用更轻量级的rest,而日趋缩短对RPC和soap的运用
  2. 经过上文的牵线,大家会意识今后webservice用于描述接口音信的wsdl以至传递音讯的soap报文都以根据xml,而那几个xml常常都会有相比复杂的格式定义,以往大概会动用更加的轻量级的json来扩充数据人机联作。
  3. 其三点实在也是对一条的互补,以后网络接口会更赞成于restful风格的规划,更轻量,对劳动的伏乞不必再在第三方应用中间转播化,而是一贯在浏览器中倡议。

本文由时时app平台注册网站发布于时时app平台注册网站,转载请注明出处:第二篇:利用shell脚本执行webservice请求——基于

关键词: