Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Web services 将现有API公开为Web服务_Web Services_Api - Fatal编程技术网

Web services 将现有API公开为Web服务

Web services 将现有API公开为Web服务,web-services,api,Web Services,Api,我目前正在进行一项任务,将API公开为Web服务。这里的想法是将JAR文件中现有的业务逻辑打包到WAR文件中,并将WAR文件作为Web服务公开,该服务将返回自由格式的XML字符串。当我们将现有API公开为Web服务时,我们提供一个返回的XML字符串数据的XSD&WSDL文件就足够了吗?这是公约还是标准惯例 这取决于您使用的是SOAP还是REST。SOAP更具限制性;因此,更希望您有一个WSDL文件来生成与API接口的类 另一方面,如果您正在使用REST,那么只公开RESTful URI就足以满足

我目前正在进行一项任务,将API公开为Web服务。这里的想法是将JAR文件中现有的业务逻辑打包到WAR文件中,并将WAR文件作为Web服务公开,该服务将返回自由格式的XML字符串。当我们将现有API公开为Web服务时,我们提供一个返回的XML字符串数据的XSD&WSDL文件就足够了吗?这是公约还是标准惯例

这取决于您使用的是SOAP还是REST。SOAP更具限制性;因此,更希望您有一个WSDL文件来生成与API接口的类

另一方面,如果您正在使用REST,那么只公开RESTful URI就足以满足RESTful web服务具有统一接口的约束

REST往往比SOAP更受欢迎,因为它是一种允许的架构风格。我更喜欢这种方法,如果您是开发web服务的新手,我会推荐这种方法

根据您使用的语言,我假设Java可以使用RESTlet或Spring3.0的REST框架来帮助您构建RESTful web服务。这些工具真的使这项工作容易得多,并帮助您遵守和满足

更新:

{ 
    "username":"jmort253",
    "mood":"good",
    "age":"not too old and not too young",
    "birthday","Jan 1, 1900"
}
假设您已经有了现有的面向对象的代码,并且假设您希望使用Spring 3.0 MVC将该代码公开为REST API,则创建一个围绕现有包的控制器子类:

示例获取

http://api.example.com:8080/users/jmort253/
资源:

请求

http://api.example.com:8080/users/jmort253/
响应:

{ 
    "username":"jmort253",
    "mood":"good",
    "age":"not too old and not too young",
    "birthday","Jan 1, 1900"
}
XML而不是JSON

http://api.example.com:8080/users/jmort253/
返回XML和返回JSON的主要区别在于所使用的封送器。使用javax.xml.bind.annotations,您可以在POJO类上放置注释,以便封送员可以将其转换为xml,从而使您不再需要手动编写xml代码:

。如果您认为XML模式是REST Web服务的一个需求,那么本资源还解释了如何生成XML模式

 @XmlRootElement
 class User implements Serializable {

     String username;
     String age;
     String birthday;
     String mood;

     String getMood() { return this.mood; }
     String getBirthday() { return this.birthday; }
     String getAge() { return this.age; }
     String getUsername() { return this.username; }

     String setMood(String mood) { this.mood = mood; }
     String setBirthday(String birthday) { this.birthday = birthday; }
     String setAge(String age) { this.age = age; }
     String setUsername(String username) { this.username = username; }
}
使用javax.xml.bind.annotations包代替ObjectMapper,而不是使用Jackson API的ObjectMapper类将POJO类封送为JSON:

JAXBContext context = JAXBContext.newInstance(User.class);
Marshaller marshaller = context.createMarshaller();

// pretty print XML
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
marshaller.marshal(user, System.out);
除了其他资源外,本文还提供了一些示例

在使用RESTWeb服务包装器时,我的最后一个建议是将日志记录级别设置为“全部”或“调试”。我发现这可以帮助我更容易地确定在设置Web服务时遇到的任何问题的根本原因。库本身将输出有用的调试消息,以帮助您解决配置问题,例如缺少依赖项、缺少注释,以及在处理转换为XML/JSON过程或设置Spring 3.0时可能遇到的其他问题


一旦设置了统一接口,并且可以发出GET请求和接收响应,就可以将日志记录级别设置回以前的信息或警告级别。

首先,我会犹豫是否将现有API作为web服务逐个公开。现有API是否编写为通过网络访问?如果不是,那么它的设计可能没有考虑到网络限制

它可能包括涉及大量小操作的方法调用,这种操作在单个进程中使用时不需要任何成本。在网络上,每个调用都有一个相关的延迟,这个延迟远远大于在同一进程中调整方法的开销

相反,我将设计一个服务来满足API的功能需求。该服务可能被设计为具有较少数量的操作,这些操作在每个操作中执行更多的工作,从而最小化与网络流量相关的开销。该服务可能通过调用API来实现(假设它是为处理多线程环境而编写的,就像服务一样)

就WSDL而言,您正在使用的工具包很可能会为您构建WSDL。我知道.NET中的WCF可以做到这一点,我使用IBMRationalWebDeveloper也做到了这一点,所以我知道Java世界也可以做到这一点

否则,手工编写WSDL和相应的模式实际上并不难。在任何一种情况下,都需要提供它们,以便您的客户可以使用该服务


如果您的API可以干净地表示为资源上的一组操作,那么使用REST进行此操作没有什么错。在本例中,是的,提供模式使您的客户机更容易处理XML。如果REST模型不能清晰地表达为对资源的操作,我会小心地迫使您的API适合REST模型。

谢谢您的回复。您是说使用REST方法返回xml字符串并提供xsd,以便客户端可以“处理”返回的xml数据。我通常看的是一个粗粒度的xml数据,大约50-100K(在txt文件中),请给出一个将现有API作为REST服务公开的示例?约翰·桑德斯——听起来最简单的事情往往是最困难的。但我肯定能够比SOAP更快地公开RESTWeb服务。别只是断言-展示出来。谢谢你的帖子。我知道你写这篇文章已经有一段时间了,但是链接显然已经改变了,我在维基百科页面上没有看到4个关键目标。谢谢你的详细回复。我认为是粗粒度服务——API本身是粗粒度的。粗粒度对象必须“适应”REST模型。无论如何,我认为这篇文章中有足够的线索/参考资料供我继续。再次感谢。