java - 使用WSDL生成REST客户端会是错误的方向吗?

标签 java python perl rest soap

我打算为Intranet创建一个相当简单的Web服务。该服务最终将成为数据库的接口,使我能够跟踪公司内部各种内部工具的工作。我在想我想要一个Web服务,以便组织内的各种工具(以及不同的语言)可以轻松地更新数据库,而无需了解架构。

我已经阅读了通过搜索https://stackoverflow.com/search?q=soap+rest已经遇到的许多相关的REST vs SOAP问题,但是我不确定是否找到了答案。

我的困境似乎是我想要REST的简单性,同时又具有WSDL的代码生成功能,这似乎暗示了SOAP。对我来说,最重要的是,各种内部工具(JAVA,Perl,Python,PHP,C++)都可以与该服务进行通信,而当需要手动重写/维护每种语言的接口层时,这似乎很愚蠢。 WSDL路由将为我做到这一点。据我所知,如果需要更改WS,您将更新WSDL,重新生成客户端存根,并对使用存根的代码进行必要的更改(无论如何都需要这样做)。

例如,假设我有一个用JAVA编写的工具,该工具利用了RESTful Web服务。我认为该工具将具有用于处理某些URL,启动请求,对响应进行处理,如果需要的话将其转换为某些数据结构的特定代码等。现在让我说我也有一个Perl工具来处理一样。现在,我需要Perl代码来执行相同的操作,在特定URL上发出请求,以获取响应,对它们进行处理,等等。在每种情况下,因此在C++和Python和C#中,代码无法共享,最终我最后会有一个包装器类/方法,这些类/方法对我来说隐藏了很多丑陋之处。我宁愿在类上调用一个函数,该函数返回封装在对象中的数据,而不必担心URL,参数,响应等。当然,在任何特定位置可能没有很多代码,但是随着时间的流逝,它开始累加起来。将其乘以每个工具,现在对服务进行更改时,我必须去更新每个CRUD操作中的URL,以及随之而来的所有操作。我想我可以想象WSDL就是为您完成的工作。您的代码仅与存根交互。存根做什么,谁在乎? Urls,参数,响应-如果发生任何变化,只需从WSDL重新生成存根即可。如果该过程导致您的代码中断,就这样,但是至少我也不必更新所有处理发出请求和响应的细节的代码。这真的不是问题吗?也许我需要做的就是创建一个服务和几个客户,然后看看我真正面对的是什么。

尽管我是一位经验丰富的程序员,并且具有JAVA,Perl,Python,C++等方面的经验,但这是我第一次考虑编写WS,并且没有其他WS的经验,因此我正在寻找一些指导。我是否只使用WSDL / SOAP,而忘了每个人都在谈论REST的流行,简单和有用吗?

最佳答案

我在这里没有代码生成问题。

REST很少需要任何形式的任何代码生成。这只是带有简单JSON(或XML)有效负载的HTTP请求。

您使用现有的HTTP库(例如Apache Commons或Python urrlib2)。您使用现有的JSON(或XML)库。 (例如,Jersey项目具有不错的JAXB-JSON转换)。

什么是“生成的”?我们在Java和Python中的RESTful库几乎完全相同,只需通过HTTP库发出REST请求即可。

class OurService {
    def getAResource( String argValue ) {
        path = { "fixed", argValue };
        URI uri= build_path( path );
        return connection.get( uri )

[我省略了异常处理。]

您是否要在复杂的SOAP接口/实现分离中分层?

客户端“使用RESTful Web服务用JAVA编写” ...“使用Perl工具做同样的事情” ...“用C++和Python和C#编写”。

正确。

“无法共享代码的地方”

正确。该代码无法共享。您必须使用适当的语言编写每个客户端。编写某种“生成器”以从WSDL创建此代码是(1)大量工作,并且(2)不必要。每种语言都有用于发出REST请求的独特语法和独特库。但是它是如此简单和通用,几乎没有任何东西。

Python中的典型示例是
class Some_REST_Stub( object ):
    def get_some_resource( self, arg ): # This name is from the WSDL
        uri = "http://host:port/path/to/resource/%s/" % arg # This path is from the WSDL
        data= urllib2.open( uri )
        return json.load( data )

此代码块比描述它所需的WSDL短。似乎更容易更改,因为名称是方法名称,而URI只是一个字符串。

在大多数语言中,客户端就是这么简单。我只是用Java写了一堆REST客户端代码。它比较复杂,但这是通用的东西。建立一个请求,解析返回的JSON。而已。

RESTful WSDL声明在许多XML中埋藏了两条微不足道的信息。
  • 它为URI提供一个“接口名称”。
  • 通过提供Stub类方法名称来记录GET,PUT,POST和DELETE的含义。

  • 因为没有太多代码,所以它不会帮助您编写太多代码。请注意,所有REST请求都具有相同的通用HttpRequest和HttpResponse结构。该请求包含通用实体。响应还包含必须解析的通用实体。 REST几乎没有-重点是要尽可能简单。

    由于所有内容都是通用的JSONObject或XML URL编码并作为字符串发送,因此它在很大程度上消除了对WSDL的需求。

    “我宁愿在类上调用一个函数,该函数返回封装在对象中的数据,而不必担心URL,参数,响应等。”

    正确,您必须编写一个“存根”类。它几乎没有代码,并且比描述它所需的WSDL短。

    “将其乘以每个工具,现在当我对服务进行更改时,必须去更新每个CRUD操作中的URL,以及随之而来的所有内容。”

    您可以为每种客户端以每种语言更新存根类。或者,您可以更新WSDL,然后重新生成每个客户端。由于URI被简单地封装在客户端代码中,因此看起来工作量是相同的。

    “我想我想使用WSDL可以为您完成这方面的工作。”

    我不清楚“完成”了什么。将冗长而复杂的WSDL转换为简单的存根类?我想这可能会有所帮助。 WSDL大于存根类。我建议您可能会发现简单地编写存根类会更容易。它比WSDL短。

    “您的代码仅与存根交互。”

    正确。

    “存根是做什么的,谁在乎呢?急促,争论,回应-如果发生任何变化,只需从WSDL重新生成存根即可。”

    可悲的是,几乎所有这些都不需要任何实际编程。从WSDL生成它比简单地编写它需要更多的工作。 URI是一个字符串。参数是通用的JSONObjects。响应是通用的HttpResponses,包括JSONArray。而已。

    “我也不必更新所有处理请求和响应细节的代码。”

    除此之外,发出请求没有任何有趣的细节。 HTTP是简单,通用的东西。 GET,POST,PUT和DELETE几乎完全相同。

    关于java - 使用WSDL生成REST客户端会是错误的方向吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2314399/

    相关文章:

    java - 将 troff 转换为 nroff

    java - 创建和显示布局时如何将焦点设置在 View 上?

    java - Android - 'JDI thread evaluations' 遇到问题

    python - 导入错误 : No module named pyodbc (Windows )

    perl - 如何从引用的变量中获取 "unlink"Perl 数组引用?

    windows - 在 Windows 命令提示符下为 Perl 输出着色

    java - Hibernate 持久实体应该有一个主键

    python - 如何有效地将数据框中的条目映射到字典

    python - 在 Ubuntu 18.04 上安装 uwsgi 时出现问题

    mysql - Perl DBD fetchrow_array 错误 :