V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
mseasons
V2EX  ›  程序员

webservice 是什么东西?

  •  
  •   mseasons · 2020-03-20 14:29:56 +08:00 · 2072 次点击
    这是一个创建于 1710 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近的任务要对接一个医院平台,清一色的 webservice,我查了半天,又是 SOAP,又是 WSDL 的,看了一个遍,也没感觉这东西有啥用……

    也没有查到这东西为什么会诞生,能查到的 webservice 资料举例都是一个开头:假如你使用一个天气服务,你定义一个 webservice,这样谁都能访问你了。

    另外有几个问题想请教大家:

    • 这东西好用在哪儿?
    • 当年为啥会诞生?
    • 相比 JSON 的优劣点在哪里?
    • 怎么用 GET 请求或者 POST 请求去简单的调用 webservice ???(这个是重点……)
    Livid
        1
    Livid  
    MOD
       2020-03-20 14:31:16 +08:00
    这是大概 2000 年左右很新潮的东西……

    那个时候微软推出了 .Net
    mseasons
        2
    mseasons  
    OP
       2020-03-20 14:37:43 +08:00
    @Livid 怎么查不到诞生目的啊,查别的技术都能查到当时为了解决 xxx 问题研发了 xxx 技术。SOAP 这种东西,为了发明而发明,改了个名字就上架了是咋回事啊……带 SOAP 的 XML 并不比正常的 XML 好在哪里呀
    harde
        3
    harde  
       2020-03-20 15:10:27 +08:00   ❤️ 1
    WSDL 约等于接口文档。
    SOAP 是协议。通过 SOAP 去调用刚才 WSDL 里“说的”,接口。

    楼主的问题不成立,你不能用现代人的眼光来问历史。
    举例:蒸汽机比汽油发动机好在哪?为啥会诞生。


    你所用的语言一般都会有 WebSerice 的实现包
    viakiba
        4
    viakiba  
       2020-03-20 15:18:02 +08:00 via iPhone
    wadl 文件 可以根据这个文件生成调用接口的代码
    mseasons
        5
    mseasons  
    OP
       2020-03-20 15:37:06 +08:00
    @harde 我的意思是,SOAP 是基于 XML 定义出来的一种技术,在我查的资料来看,定义出来的新东西没有比单纯的 XML 好用多少
    harde
        6
    harde  
       2020-03-20 15:43:11 +08:00
    @mseasons 你自己随便定义一个 XML 没法“通用”、“跨语言”,当然,你可以说双方约定好就行,但是那也不是 WebService 的适用场合。
    brucewuio
        7
    brucewuio  
       2020-03-20 16:01:48 +08:00
    说白了就是用 xml 进行通信,用 xml 告诉别人你有什么服务可以调用,很傻逼的东西
    g00001
        8
    g00001  
       2020-03-20 16:19:43 +08:00
    WebService 在 VS/C#里,只要把网址输进去,
    开发工具就会做好一切,然后就可以直接在代码里使用远程的函数,体验上接近于在用本地函数。

    这个东西最大的缺陷就是把所有事考虑的太完美了,导致协议太复杂。
    即使在 Windows 自家的系统上,部署这个东西也非常麻烦,MSSOAP 组件就有一个很大的安装包,安装这个以前还先要装 MSXML 组件,然后安装的时候还要管理权限,带上一堆的 DLL,然后微软还把这个组件给淘汰了,各种折腾 - 想法一直在变。其他平台就更麻烦了。

    WebService 最轻量的实现估计是 aardio 里的实现,SOAP 客户端支持库仅使用了几百行代码,用起来还是很舒服的。下面是 aardio 里的一个例子:

    ----------------------------------------------------------
    import console;
    import web.soapClient;

    //创建 SOAP 客户端
    seviceClient = web.soapClient("http://fy.webxml.com.cn/webservices/EnglishChinese.asmx")

    //调用远程 Web 服务提供的函数
    var transArray = seviceClient.TranslatorString("hello");

    //显示返回值
    console.dumpJson( transArray ) ;
    console.pause();
    ----------------------------------------------------------

    但是用起来舒服并没有用,因为现在支持这种接口的很少,大家都 JSON 接口,用起来更简单,实现的功能也差不多。兴一个 aardio 里调用 REST/JSON 接口的例子:

    ----------------------------------------------------------
    import console;
    import web.rest.jsonClient;

    var http = web.rest.jsonClient();
    var jsonstore = http.api("https://www.jsonstore.io/e5fd2bdf0e6b3ba3fe4aa61eebd11740cf2fe10e7fad1b5d2fb77c876498baf5");

    //增
    var result = jsonstore.user[1].post( name = "jon.snow"; age = 31 )

    //改
    var result = jsonstore.user[1].age.put(32);

    //查
    var result = jsonstore.user[1].get();

    //删
    var result = jsonstore.user[1].delete();

    console.dump(result);
    console.pause();
    ----------------------------------------------------------



    一样可以把远程接口变成本地函数,并且有舒服的智能提示,而且实现起来更简单,WebService 的优势就不多了。
    mseasons
        9
    mseasons  
    OP
       2020-03-20 16:19:56 +08:00
    @harde 即便是自己定义的 XML,也并不影响通用性和跨语言吧? XML 本质就是一个树,每个标签就是一个节点,只要知道参数名字,仍然可以通用。XML 和 JSON 没什么两样啊
    mseasons
        10
    mseasons  
    OP
       2020-03-20 16:23:29 +08:00
    @g00001 多谢…… 我在调用很久之前的 webservice 的时候,尝试了各种方法。SoapUI 失败,对面说 SOAPUI 对 CDATA 支持不好,用 Java 的那个 axis 库,到现在还在报错,也没调出来原因。webservice 也没有很方便的转化成正常的 GET/POST 来使用 postman 调试,还在挣扎中
    harde
        11
    harde  
       2020-03-20 17:01:00 +08:00
    @mseasons 我的意思是你并不能用现代人眼光来看 20 年前的东西。
    当年能提出 WebService 已经非常超前了。你不能说现在有了这么多简洁明了的东西,就说当年这个东西设计的不好。
    wanguorui123
        12
    wanguorui123  
       2020-03-20 18:08:21 +08:00 via iPhone
    WebService 好在规范的接口,WSDL 文档可以直接生成 API 客户端代码,调用接口和调用本地方法一样简单。

    当年为了实现企业之间服务的调用,又不想写一大堆 API 文档,所以就诞生出这个东西。

    相对于 JSON API 不需要一大堆接口文档,写服务接口时候加入注解就 OK 了,有点类似 Swagger。基本上没使用成本,也不用关心序列化和反序列化,但是浏览器端调用很麻烦所以就淘汰了。

    WebService 走 POST 请求,如果是 JAVA 平台有第三方包可以调用,如果是 NET 可以自动生成客户端 API 函数,像调用本地方法一样简单。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2711 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 11:10 · PVG 19:10 · LAX 03:10 · JFK 06:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.