如何将Spring API制作为可通过互联网访问的公共Web服务?
实现公开可访问的Spring WebService 完整方案
一、基础依赖引入
首先在pom.xml(Maven)或build.gradle(Gradle)里引入对应依赖,以Maven为例:
如果需要实现SOAP协议的传统WebService:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web-services</artifactId> </dependency> <dependency> <groupId>wsdl4j</groupId> <artifactId>wsdl4j</artifactId> </dependency>
如果需要实现更通用的REST风格WebService:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
二、核心代码实现与注解说明
SOAP协议WebService实现
- 第一步编写配置类,开启WebService相关能力:
@Configuration @EnableWs // 开启Spring WebService原生支持 public class WebServiceConfig extends WsConfigurerAdapter { // 注册请求调度Servlet,处理所有WebService请求 @Bean public ServletRegistrationBean<MessageDispatcherServlet> messageDispatcherServlet(ApplicationContext applicationContext) { MessageDispatcherServlet servlet = new MessageDispatcherServlet(); servlet.setApplicationContext(applicationContext); servlet.setTransformWsdlLocations(true); // 自动适配部署后的真实公网地址到WSDL文件中 return new ServletRegistrationBean<>(servlet, "/ws/*"); // 所有/ws路径下的请求都走WebService调度逻辑 } // 对外暴露WSDL文件,外部可通过 /ws/xxx.wsdl 路径直接获取 @Bean(name = "publicService") public DefaultWsdl11Definition publicServiceWsdl(XsdSchema publicSchema) { DefaultWsdl11Definition wsdl = new DefaultWsdl11Definition(); wsdl.setPortTypeName("PublicServicePort"); wsdl.setLocationUri("/ws"); wsdl.setTargetNamespace("http://你定义的命名空间地址"); wsdl.setSchema(publicSchema); return wsdl; } @Bean public XsdSchema publicSchema() { // 加载你提前定义好的、描述请求响应结构的XSD文件 return new SimpleXsdSchema(new ClassPathResource("public_service.xsd")); } }
- 第二步编写业务处理端点:
@Endpoint // 标记当前类为WebService请求处理端点 public class PublicServiceEndpoint { private static final String NAMESPACE_URI = "http://你定义的命名空间地址"; // 匹配指定命名空间下的请求节点 @PayloadRoot(namespace = NAMESPACE_URI, localPart = "getDataRequest") @ResponsePayload // 标记方法返回值为响应报文的正文内容 public GetDataResponse handleRequest(@RequestPayload GetDataRequest request) { // @RequestPayload 标记入参为请求报文的正文内容 GetDataResponse response = new GetDataResponse(); // 编写你的业务逻辑 return response; } }
REST风格WebService实现
- 直接编写接口Controller即可:
@RestController // 标记当前类为REST接口处理类,所有方法返回值自动序列化为JSON/XML格式 @RequestMapping("/api/public") // 统一公共接口的访问前缀 @CrossOrigin(origins = "*") // 允许所有来源跨域访问,生产环境可按需限制可信来源 public class PublicApiController { @GetMapping("/info/{id}") // 处理GET类型请求,匹配路径/api/public/info/xxx public Info getInfo(@PathVariable Long id) { // 业务逻辑 return new Info(); } @PostMapping("/submit") // 处理POST类型请求 public String submitData(@RequestBody DataDTO data) { // 业务逻辑 return "操作成功"; } }
三、互联网访问配置
要让服务可被公网访问,需要完成以下配置:
- 把服务部署到有公网IP的云服务器,或者用内网穿透工具将本地服务端口映射到公网
- 开放服务器安全组、防火墙的服务端口,Spring Boot默认端口为8080,可在application.yml中修改:
server: port: 80
- 有域名的场景下可将域名解析到公网IP,配置Nginx反向代理到Spring服务,同时可配置SSL证书开启HTTPS访问
- 公开服务建议额外增加API密钥、签名校验等鉴权逻辑,避免被恶意调用
内容的提问来源于stack exchange,提问作者pheromix
相关产品推荐
相关产品推荐

