TutorialsPoint WebService 教程

来源：https://www.yiibai.com/web_service

Web Service教程

原文：https://www.yiibai.com/web_service

本Web Services教程专为初学者和专业人员而设计，提供Web服务的基本和高级概念，如协议，SOAP，RESTful，Java Web服务实现，JAX-WS和JAX-RS教程和示例。

Web服务是一种将一种编程语言与另一种语言进行通信的技术 例如，java编程语言可以通过使用Web服务与PHP和.Net交互。换句话说，Web服务提供了实现互操作性的方法。

在本教程中，您将能够学习Java Web服务及其规范，例如JAX-WS和JAX-RS。

有两种方法可以通过RPC样式和Document样式为JAX-WS编写代码。 与JAX-WS一样，JAX-RS可以由Jersey和RESTeasy编写。 我们稍后会学习所有这些技术。

在本教程中，我们将看到很多Web服务示例，例如：RPC样式的JAX-WS示例，文档样式的JAX-WS示例，Jersey的JAX-RS示例和RESTeasy实现的JAX-RS示例。

面向读者

本教程是为初学者准备的，旨在帮助他们理解与Web Services相关的基本概念。 本教程将为您提供有关Web Services的理解和应用，读者可以从这里获得更高级别的Web Services专业知识。前提条件在继续本教程之前，读者应该具备Java的基本知识。因此，您需要对Java等编程有基本的了解，有助于充分学习本教程。

问题与反馈

我们不能保证您在学习此Web Services教程的过程中不会遇到任何问题。本教程中的讲解，示例和代码等只是根据作者的理解来概括写出。由于作者水平和能力有限，因此不保正所有编写的文章都准确无误。但是如果有遇到任何错误或问题，请反馈给我们，我们会及时纠正以方便后续读者阅读。

易百教程移动端：请扫描本页面底部(右侧)二维码并关注微信公众号，回复："教程" 选择相关教程阅读或直接访问：http://m.yiibai.com 。

Web Service简介

原文：https://www.yiibai.com/web_service/what-is-web-service.html

Web Service可以通过以下方式定义：

是客户端服务器应用程序或应用程序组件进行通信

网络上两个设备之间的通信方法。

是一个可互操作的机器到机器通信的软件系统。

是用于在两个设备或应用程序之间交换信息的标准或协议的集合。

让我们通过下面给出的图示来理解：

如图所示，java，.net或PHP应用程序可以通过网络上的Web服务与其他应用程序通信。 例如，Java应用程序可以与Java，.Net和PHP应用程序交互。 因此，Web服务是一种独立于语言的通信方式。

Web Service组件

原文：https://www.yiibai.com/web_service/web-service-components.html

Web Service有三个主要的Web服务组件。它们分别如下所列 -

SOAP

WSDL

UDDI

1. SOAP

SOAP是简单对象访问协议(Simple Object Access Protocol)的首字母缩写。
SOAP是一种基于XML的协议，用于访问Web服务。
SOAP是应用程序之间通信的W3C建议。

SOAP是基于XML的，因此它独立于平台且与语言无关。 换句话说，它可以在任何平台上与Java，.Net或PHP语言一起使用。

2. WSDL

WSDL是Web服务描述语言的首字母缩写。
WSDL是一个xml文档，包含有关Web服务的信息，例如方法名称，方法参数以及如何访问它。
WSDL是UDDI的一部分。 它充当Web服务应用程序之间的接口。
WSDL发音为：wiz-dull。

3. UDDI

UDDI是通用描述，发现和集成(Universal Description, Discovery and Integration)的首字母缩写。
UDDI是一个基于XML的框架，用于描述，发现和集成Web服务。
UDDI是WSDL描述的Web服务接口的目录，包含有关Web服务的信息。

SOAP Web Services

原文：https://www.yiibai.com/web_service/soap-web-services.html

SOAP代表简单对象访问协议。 它是一种基于XML的协议，用于访问Web服务。
SOAP是W3C推荐用于两个应用程序之间通信的协议。
SOAP是基于XML的协议。 它独立于平台，与语言无关。 通过使用SOAP，您将能够与其他编程语言应用程序进行交互。

Soap Web服务的优点

WS安全：SOAP定义了自己的安全性，称为WS Security。

独立于语言和平台：SOAP Web服务可以用任何编程语言编写，并在任何平台上执行。

Soap Web服务的缺点

比较慢：SOAP使用必须解析才能读取的XML格式。 它定义了开发SOAP应用程序时必须遵循的许多标准。 所以它很慢并且消耗更多的带宽和资源。

依赖于WSDL：SOAP使用WSDL，并且没有任何其他机制来发现服务。

RESTful Web Services

原文：https://www.yiibai.com/web_service/restful-web-services.html

REST代表REpresentational State Transfer。REST是一种架构风格，而不是协议。

RESTful Web服务的优点

快速：RESTful Web服务很快，因为没有像SOAP这样严格的规范，它消耗更少的带宽和资源。
独立于语言和平台：RESTful Web服务可以用任何编程语言编写，并可在任何平台上执行。
可以使用SOAP：RESTful Web服务可以使用SOAP Web服务作为实现。
允许不同的数据格式：RESTful Web服务允许不同的数据格式，如纯文本，HTML，XML和JSON。

有关RESTful的详细教程，可参考以下网址：

http://www.yiibai.com/restful/

SOAP和REST Web Services比较

原文：https://www.yiibai.com/web_service/soap-vs-rest-web-services.html

SOAP和REST Web服务之间存在许多差异。下面给出了SOAP和REST之间的重要差异：

序号 | SOAP | REST
1 | SOAP是一种协议。 | REST是一种架构风格。
2 | SOAP代表简单对象访问协议。 | REST代表REpresentational状态传输。
3 | SOAP不能使用REST，因为它是一种协议。 | REST可以使用SOAP Web服务，因为它是一个概念，可以使用任何协议，如：HTTP，SOAP。
4 | SOAP使用服务接口来公开业务逻辑。 | REST使用URI来公开业务逻辑。
5 | JAX-WS是SOAP Web服务的Java API。 | JAX-RS是RESTful Web服务的Java API。
6 | SOAP定义了严格遵循的标准。 | REST没有定义太多像SOAP这样的标准。
7 | SOAP比REST需要更多的带宽和资源。 | REST比SOAP需要更少的带宽和资源。
8 | SOAP定义了自己的安全性。 | RESTful Web服务从底层传输继承安全措施。
9 | SOAP仅允许XML数据格式。 | REST允许不同的数据格式，如：纯文本，HTML，XML，JSON等。
10 | SOAP不如REST受推荐使用。 | REST比SOAP更受欢迎。

面向服务架构（SOA）

原文：https://www.yiibai.com/web_service/service-oriented-architecture.html

面向服务的体系结构(英文：Service Oriented Architecture)是一种设计模式。 它旨在通过协议为其他应用程序提供服务。 它只是一个概念，不依赖于任何编程语言或平台。

Web services差不多是SOA的一种技术。

服务

服务是定义明确的自包含功能，代表功能单元。 服务可以从另一个服务交换信息。 它不依赖于另一个服务的状态。

服务连接

下图给出了面向服务的体系结构。 服务使用者向服务提供者发送服务请求，服务提供者将服务响应发送给服务使用者。 服务消费者和服务提供者都可以理解服务连接。

Java Web Service

原文：https://www.yiibai.com/web_service/java-web-services.html

在本Java Web服务教程文章中，提供了两个主要的Java Web服务API的概念和示例：JAX-WS和JAX-RS。 可以通过其他编程语言(如.Net和PHP)访问Java Web服务应用程序。

Java Web服务应用程序通过WSDL(Web服务描述语言)执行通信。 编写java Web服务应用程序代码有两种方法：SOAP和RESTful。

Java Web Services API

自JavaEE 6以来，Java已经定义了两个用于开发Web服务应用程序的主要API。

JAX-WS ：用于SOAP Web服务。 编写JAX-WS应用程序代码的方法有两种：RPC样式和Document样式。

JAX-RS ：用于RESTful Web服务。 目前主要有2个实现用于创建JAX-RS应用程序：Jersey和RESTeasy。

JAX-WS教程

原文：https://www.yiibai.com/web_service/jax-ws-tutorial.html

JAX-WS教程提供了JAX-WS API的概念和示例。 此JAX-WS教程专为初学者和专业人士设计。

有两种方法可以用于开发JAX-WS，它们分别如下：

RPC风格

文档风格

如下图所示 -

RPC与文档样式Web服务之间的区别

https://www.yiibai.com/web_service/difference-between-rpc-and-document.html

JAX-WS RPC样式示例

https://www.yiibai.com/web_service/jax-ws-example-rpc-style.html

JAX-WS文档样式示例

https://www.yiibai.com/web_service/jax-ws-example-document-style.html

JAX-WS部分

RPC和文档Web服务的区别

原文：https://www.yiibai.com/web_service/difference-between-rpc-and-document.html

RPC和文档Web服务之间存在许多差异，它们之间的重要区别如下：

1. RPC样式

以下是RPC样式Web Service的重要特性：

RPC样式的Web服务使用方法名称和参数来生成XML结构。

RPC样式生成的WSDL很难针对模式进行验证。

在RPC样式中，SOAP消息被发送为多个元素。

RPC样式消息紧密耦合。

在RPC样式中，SOAP消息保留操作名称。

在RPC样式中，参数作为离散值发送。

让我们看一下RPC样式生成的WSDL文件。

WSDL文件：

在WSDL文件中，它不指定类型详细信息。

<types/>

对于消息部分，它定义名称和类型属性。

<message name="getHelloWorldAsString">
<part name="arg0" type="xsd:string"/>
</message>
<message name="getHelloWorldAsStringResponse">
<part name="return" type="xsd:string"/>
</message>

对于soap:body，它定义了use和namespace属性。

<binding name="HelloWorldImplPortBinding" type="tns:HelloWorld">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="rpc"/>
<operation name="getHelloWorldAsString">
<soap:operation soapAction=""/>
<input>
<soap:body use="literal" namespace="http://yiibai.com/"/>
</input>
<output>
<soap:body use="literal" namespace="http://yiibai.com/"/>
</output>
</operation>
</binding>

文档样式

可以根据预定义模式验证文档样式Web服务。

在文档样式中，SOAP消息作为单个文档发送。

文档样式消息松散耦合。

在文档样式中，SOAP消息中不需要操作名称。

在文档样式中，参数以XML格式发送。

让我们看一下文档样式生成的WSDL文件。

WSDL文件：
在WSDL文件中，它指定具有namespace和schemaLocation的类型详细信息。

<types>
<xsd:schema>
<xsd:import namespace="http://yiibai.com/" schemaLocation="http://localhost:7779/ws/hello?xsd=1"/>
</xsd:schema>
</types>

对于消息部分，它定义名称和元素属性。

<message name="getHelloWorldAsString">
<part name="parameters" element="tns:getHelloWorldAsString"/>
</message>
<message name="getHelloWorldAsStringResponse">
<part name="parameters" element="tns:getHelloWorldAsStringResponse"/>
</message>

对于soap:body，它只定义use属性而不是namespace。

<binding name="HelloWorldImplPortBinding" type="tns:HelloWorld">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
<operation name="getHelloWorldAsString">
<soap:operation soapAction=""/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
</binding>

JAX-WS示例(RPC样式)

原文：https://www.yiibai.com/web_service/jax-ws-example-rpc-style.html

创建JAX-WS示例是一项简单的任务，因为它不需要额外的配置设置。

JAX-WS API内置于JDK中，因此无需为其加载任何额外的jar文件。 让我们看一下RPC样式的JAX-WS简单示例。

创建一个Java项目：JAXWSHelloworld，在这个项目中创建了4个文件：

HelloWorld.java

HelloWorldImpl.java

Publisher.java

HelloWorldClient.java

前3个文件是为服务器端应用程序创建的，最后1个是为客户端应用程序创建的。

1. JAX-WS服务端代码

文件: HelloWorld.java 的内容如下 -

package com.yiibai;

import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;

//Service Endpoint Interface
@WebService
@SOAPBinding(style = Style.RPC)
public interface HelloWorld{
    @WebMethod String getHelloWorldAsString(String name);
}

文件: HelloWorldImpl.java 的内容如下 -

package com.yiibai;

import javax.jws.WebService;

//Service Implementation
@WebService(endpointInterface = "com.yiibai.HelloWorld")
public class HelloWorldImpl implements HelloWorld{
  @Override
  public String getHelloWorldAsString(String name) {
      return "Hello World JAX-WS " + name;
  }
}

文件: Publisher.java 的内容如下 -

package com.yiibai;

import javax.xml.ws.Endpoint;

//Endpoint publisher
public class Publisher {
    public static void main(String[] args) {
        Endpoint.publish("http://localhost:7788/ws/hello", new HelloWorldImpl());
    }
}

如何查看生成的WSDL?

运行发布者(Publisher.java)代码后，可以通过访问URL来查看生成的WSDL文件：

http://localhost:7788/ws/hello?wsdl

2. JAX-WS客户端代码

文件：HelloWorldClient.java -

package com.yiibai;

import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;

public class HelloWorldClient {
    public static void main(String[] args) throws Exception {
        URL url = new URL("http://localhost:7788/ws/hello?wsdl");

        // 1st argument service URI, refer to wsdl document above
        // 2nd argument is service name, refer to wsdl document above
        QName qname = new QName("http://www.yiibai.com/", "HelloWorldImplService");
        Service service = Service.create(url, qname);
        HelloWorld hello = service.getPort(HelloWorld.class);
        System.out.println(hello.getHelloWorldAsString("yiibai rpc"));
    }
}

执行上面的客户端代码，得到以下结果 -

Hello World JAX-WS yiibai rpc

JAX-WS示例(文档样式)

原文：https://www.yiibai.com/web_service/jax-ws-example-document-style.html

与RPC样式一样，可以在文档样式中创建JAX-WS示例。 为此，您只需要在服务接口中更改一行。
需要将Style.DOCUMENT用于@SOAPBinding注释来代替Style.RPC。下面我们来看看：

文件: HelloWorld.java -

@SOAPBinding(style = Style.DOCUMENT) // 它从RPC更改为 DOCUMENT

现在让我们看一下文档样式中JAX-WS的完整示例。打开 Eclipse ，创建一个Java工程：jaxwsdocument，并创建4个文件：

HelloWorld.java

HelloWorldImpl.java

Publisher.java

HelloWorldClient.java

前3个文件是为服务器端应用程序创建的，客户端应用程序为创建1个文件。

JAX-WS服务器代码

文件：HelloWorld.java -

package com.yiibai;

import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;

//Service Endpoint Interface
@WebService
@SOAPBinding(style = Style.DOCUMENT)
public interface HelloWorld{
    @WebMethod String getHelloWorldAsString(String name);
}

文件：HelloWorldImpl.java -

package com.yiibai;

import javax.jws.WebService;

//Service Implementation
@WebService(endpointInterface = "com.yiibai.HelloWorld")
public class HelloWorldImpl implements HelloWorld{
  @Override
  public String getHelloWorldAsString(String name) {
      return "Hello World JAX-WS " + name;
  }
}

文件：Publisher.java -

package com.yiibai;

import javax.xml.ws.Endpoint;

//Endpoint publisher
public class Publisher {
    public static void main(String[] args) {
        Endpoint.publish("http://localhost:7788/ws/hello", new HelloWorldImpl());
    }
}

如果运行Publisher类，则可能会生成以下错误：

Wrapper class com.yiibai.GetHelloWorldAsString is not found.
Have you run APT to generate them?

要解决此问题，请在命令提示符下转到当前项目的bin目录。然后，运行以下命令：

wsgen -keep -cp . com.yiibai.HelloWorldImpl

现在，它将生成2个文件：

SayHello

SayHelloResponse

将这些文件粘贴到com.yiibai 目录中，然后运行Publisher 类。

如何查看生成的WSDL？

运行Publisher 代码后，可以通过访问URL来查看生成的WSDL文件：

http://localhost:7788/ws/hello?wsdl

JAX-WS客户端代码

文件：HelloWorldClient.java -

package com.yiibai;

import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
public class HelloWorldClient{
    public static void main(String[] args) throws Exception {
    URL url = new URL("http://localhost:7788/ws/hello?wsdl");

        //1st argument service URI, refer to wsdl document above
    //2nd argument is service name, refer to wsdl document above
        QName qname = new QName("http://www.yiibai.com/", "HelloWorldImplService");
        Service service = Service.create(url, qname);
        HelloWorld hello = service.getPort(HelloWorld.class);
        System.out.println(hello.getHelloWorldAsString("yiibai document web service"));
     }
 }

执行上面客户端代码，得到以下结果-

Hello World JAX-WS yiibai document web service

JAX-RS部分

JAX-RS教程

原文：https://www.yiibai.com/web_service/jax-rs-tutorial.html

JAX-RS教程提供了JAX-RS API的概念和示例。 这个JAX-RS教程专为初学者和专业人士设计。

JAX-RS API有两个主要实现。它们分别如下 -

Jersey

RESTEasy

如下图示 -

RESTful JAX-RS示例(Jersey)

https://www.yiibai.com/web_service/jax-rs-example-jersey.html

JAX-WS注释示例

https://www.yiibai.com/web_service/jax-rs-annotations-example.html

JAX-RS文件下载示例

https://www.yiibai.com/web_service/jax-rs-file-download-example.html

JAX-RS文件上传示例

https://www.yiibai.com/web_service/jax-rs-file-upload-example.html

JAX-RS示例（Jersey）

原文：https://www.yiibai.com/web_service/jax-rs-example-jersey.html

我们可以通过 jersey 实现创建JAX-RS示例。 为此，需要加载 jersey相关jar文件或使用Maven框架。

在这个例子中，我们使用jersey jar文件来实现JAX-RS jersey示例。

Jersey Jar文件下载网址：https://jersey.github.io/download.html

打开Eclipse，创建一个Web工程: restfuljersey，如下图所示 -

JAX-RS创建了4个文件示例：

Hello.java

web.xml

index.html

HelloWorldClient.java

前3个文件是为服务器端创建的，最后一个文件：HelloWorldClient.java 是为客户端应用程序创建的。

JAX-RS服务器代码

文件：Hello.java -

package com.yiibai.rest;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("/hello")
public class Hello {
  // This method is called if HTML and XML is not requested
  @GET
  @Produces(MediaType.TEXT_PLAIN)
  public String sayPlainTextHello() {
    return "Hello Jersey Plain";
  }
  // This method is called if XML is requested
  @GET
  @Produces(MediaType.TEXT_XML)
  public String sayXMLHello() {
    return "<?xml version=\"1.0\"?>" + "<hello> Hello Jersey" + "</hello>";
  }

  // This method is called if HTML is requested
  @GET
  @Produces(MediaType.TEXT_HTML)
  public String sayHtmlHello() {
    return "<html> " + "<title>" + "Hello Jersey" + "</title>"
        + "<body><h1>" + "Hello Jersey HTML" + "</h1></body>" + "</html> ";
  }
}

文件：web.xml -

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
 <servlet>
    <servlet-name>Jersey REST Service</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>com.yiibai.rest</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>Jersey REST Service</servlet-name>
    <url-pattern>/rest/*</url-pattern>
  </servlet-mapping>
</web-app>

文件：index.html -

<a href="rest/hello">点击这里查看</a>

现在在服务器上运行此应用程序 这里Tomcat服务器是在端口8080上运行。项目名称是restfuljersey。

运行项目后，点击上面链接，将看到以下输出：

JAX-RS客户端代码

文件：ClientTest.java 在服务器应用程序内创建，也可以通过服务接口和jersey jar文件来运行其他应用程序的客户端代码。

文件：ClientTest.java -

package com.yiibai.restclient;
import java.net.URI;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.UriBuilder;
import org.glassfish.jersey.client.ClientConfig;
public class ClientTest {
  public static void main(String[] args) {
    ClientConfig config = new ClientConfig();
    Client client = ClientBuilder.newClient(config);
    WebTarget target = client.target(getBaseURI());
    //Now printing the server code of different media type
    System.out.println(target.path("rest").path("hello").request().accept(MediaType.TEXT_PLAIN).get(String.class));
    System.out.println(target.path("rest").path("hello").request().accept(MediaType.TEXT_XML).get(String.class));
    System.out.println(target.path("rest").path("hello").request().accept(MediaType.TEXT_HTML).get(String.class));
  }
  private static URI getBaseURI() {
    //here server is running on 8080 port number and project name is restfuljersey
    return UriBuilder.fromUri("http://localhost:8080/restfuljersey").build();
  }
}

执行上面客户端代码，得到以下结果 -

Hello Jersey Plain
<?xml version="1.0"?><hello> Hello Jersey</hello>
<html> <title>Hello Jersey</title><body><h1>Hello Jersey HTML</h1></body></html>

RESTful JAX-RS注解示例

原文：https://www.yiibai.com/web_service/jax-rs-annotations-example.html

JAX-RS API提供以下注解可在java中开发RESTful应用程序。 下面我们将使用 jersey 实现来开发JAX-RS示例。首先打开Eclipse，创建一个动态Web项目：JaxrsWeb。

Jersey Jar文件下载网址：https://jersey.github.io/download.html

1. JAX-RS注释

javax.ws.rs 包中包含JAX-RS注释。

注解 | 描述
Path | 它标识URI路径，它可以在类或方法上指定。
PathParam | 表示URI路径的参数。
GET | 指定方法响应GET请求。
POST | 指定方法响应POST请求。
PUT | 指定方法响应PUT请求。
HEAD | 指定方法响应HEAD请求。
DELETE | 指定方法响应DELETE请求。
OPTIONS | 指定方法响应OPTIONS请求。
FormParam | 表示表单的参数。
QueryParam | 表示URL的查询字符串的参数。
HeaderParam | 表示标头的参数。
CookieParam | 表示cookie的参数。
Produces | 定义响应的媒体类型，例如：XML，PLAIN，JSON等。它定义资源类或MessageBodyWriter的方法可以生成的媒体类型。
Consumes | 它定义资源类或MessageBodyReader的方法可以生成的媒体类型。

2. JAX-RS @Path, @GET 和 @PathParam 注解

文件：HelloService.java -

package com.yiibai;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.core.Response;
@Path("/hello")
public class HelloService{
    @GET
    @Path("/{param}")
    public Response getMsg(@PathParam("param") String msg) {
        String output = "Jersey say : " + msg;
        return Response.status(200).entity(output).build();
    }
}

文件：web.xml -

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
 <servlet>
    <servlet-name>Jersey REST Service</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
     <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>com.yiibai</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>Jersey REST Service</servlet-name>
    <url-pattern>/rest/*</url-pattern>
  </servlet-mapping>
</web-app>

文件：index.html -

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JAX-RS Server示例</title>
</head>
<body>
    <a href="rest/hello/yiibai">JAX-RS注解参数示例</a>
</body>
</html>

现在在服务器上运行此应用程序，您将看到以下输出：

3. JAX-RS多个@PathParam

文件：HelloService.java -

package com.yiibai;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.core.Response;
@Path("/hello")
public class HelloService{
    @GET
    @Path("/{param}")
    public Response getMsg(@PathParam("param") String msg) {
        String output = "Jersey say : " + msg;
        return Response.status(200).entity(output).build();
    }

    @GET
    @Path("{year}/{month}/{day}")
    public Response getDate(
            @PathParam("year") int year,
            @PathParam("month") int month,
            @PathParam("day") int day) {

       String date = year + "/" + month + "/" + day;

       return Response.status(200)
        .entity("getDate is called, year/month/day : " + date)
        .build();
    }
}

文件：web.xml 的内容与上面的例子相同。

文件：index.html -

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JAX-RS Server示例</title>
</head>
<body>
    <a href="rest/hello/yiibai">JAX-RS注解参数示例</a><br/>
    <a href="rest/hello/2019/12/05">JAX-RS注解参数(日期)示例</a>
</body>
</html>

现在在服务器上运行此应用程序，您将看到以下输出：

4. JAX-RS @FormParam和@POST注解

文件: ProductService.java -

package com.yiibai;

import javax.ws.rs.FormParam;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.core.Response;
@Path("/product")
public class ProductService{
    @POST
    @Path("/add")
    public Response addUser(
        @FormParam("id") int id,
        @FormParam("name") String name,
        @FormParam("price") float price) {

        return Response.status(200)
            .entity(" Product added successfuly!<br> Id: "+id+"<br> Name: " + name+"<br> Price: "+price)
            .build();
    }
}

文件：web.xml 的内容与上面的例子相同。

文件：index.html 的内容如下 -

<form action="rest/product/add" method="post">
Enter Id:<input type="text" name="id"/><br/><br/>
Enter Name:<input type="text" name="name"/><br/><br/>
Enter Price:<input type="text" name="price"/><br/><br/>
<input type="submit" value="Add Product"/>
</form>

现在在服务器上运行此应用程序，您将看到以下输出：

填写产品信息并提交 -

RESTful JAX-RS文件下载示例

原文：https://www.yiibai.com/web_service/jax-rs-file-download-example.html

在这小节中将演示如何通过JAX-RS API下载java中的文本文件，图像文件，pdf文件和excel文件。 为此需要编写几行代码。 在这里使用 jersey 实现来开发JAX-RS文件下载示例。

首先打开Eclipse，创建一个动态Web项目：JaxRsFileDownload 。项目结构如下图所示 -

Jersey Jar文件下载网址：https://jersey.github.io/download.html

需要指定不同的内容类型以下载不同的文件。 @Produces注解用于指定文件内容的类型。

@Produces("text/plain"): 用于下载文本文件。

@Produces("image/png"): 用于下载图片文件。

@Produces("application/pdf"): 用于下载PDF文件。

@Produces("application/vnd.ms-excel"): 用于下载Excel文件。

@Produces("application/msword"): 用于下载Word文件。

1. JAX-RS文本文件下载

文件：FileDownloadService.java -

package com.yiiba.rest;

import java.io.File;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;
@Path("/files")
public class FileDownloadService {
    private static final String FILE_PATH = "D:\\myfile.txt";
    @GET
    @Path("/txt")
    @Produces("text/plain")
    public Response getFile() {
        File file = new File(FILE_PATH);

        ResponseBuilder response = Response.ok((Object) file);
        String download_filename = "yiibai_file.txt";
        response.header("Content-Disposition","attachment; filename="+download_filename);
        return response.build();

    }
 }

文件: web.xml -

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
 <servlet>
    <servlet-name>Jersey REST Service</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>com.yiiba.rest</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>Jersey REST Service</servlet-name>
    <url-pattern>/rest/*</url-pattern>
  </servlet-mapping>
</web-app>

文件: index.html -

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JAX-RS文件下载示例</title>
</head>
<body>
    <a href="rest/files/txt">点这里下载文本文件</a>
    <br />
</body>
</html>

现在在服务器上运行此应用程序，您将看到以下输出：

点击下载链接，显示结果如下 -

2. JAX-RS图像文件下载

文件: FileDownloadService.java -

package com.yiibai.rest;
import java.io.File;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;
@Path("/files")
public class FileDownloadService {
    private static final String FILE_PATH = "D:\\myimage.png";
    @GET
    @Path("/image")
    @Produces("image/png")
    public Response getFile() {
        File file = new File(FILE_PATH);
        String filename = "yiibai_image.png";
        ResponseBuilder response = Response.ok((Object) file);
        response.header("Content-Disposition","attachment; filename="+filename);
        return response.build();

    }
 }

文件：web.xml 的内容与上面的例子相同。

文件：index.html 的内容如下所示 -

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JAX-RS文件下载示例</title>
</head>
<body>
    <a href="rest/files/txt">点这里下载文本文件</a>
    <br />
    <a href="rest/files/image">点这里下载图片文件</a>
    <br />
</body>
</html>

3. JAX-RS PDF文件下载

文件：FileDownloadService.java -

package com.yiibai.rest;
import java.io.File;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;
@Path("/files")
public class FileDownloadService {
    private static final String FILE_PATH = "c:\\mypdf.pdf";
    @GET
    @Path("/pdf")
    @Produces("application/pdf")
    public Response getFile() {
        File file = new File(FILE_PATH);
        String filename = "yiibai_pdf.pdf";
        ResponseBuilder response = Response.ok((Object) file);
        response.header("Content-Disposition","attachment; filename="+filename);
        return response.build();
    }
 }

文件：web.xml 的内容与上面的例子相同。

文件：index.html 的内容如下所示 -

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JAX-RS文件下载示例</title>
</head>
<body>
    <a href="rest/files/txt">点这里下载文本文件</a>
    <br />
    <a href="rest/files/image">点这里下载图片文件</a>
    <br />
    <a href="rest/files/pdf">点这里下载PDF文件</a>
    <br />
</body>
</html>

RESTful JAX-RS文件上传示例

原文：https://www.yiibai.com/web_service/jax-rs-file-upload-example.html

与上一篇教程中讲解的文件下载一样，JAX-RS也可以实现上传文件，上传的文件类型可以是：图像文件，PDF文件，Excel文件，文本文件等。

@FormDataParam("file")注释用于提及服务类中的file参数。

@Consumes(MediaType.MULTIPART_FORM_DATA)用于提供文件上载的信息。

要使用JAX-RS API上传文件，我们将使用jersey 来实现。首先打开Eclipse，创建一个动态Web项目：JAXRSFileUpload，结构如下所示 -

要通过jersey实现上传文件，需要在web.xml 文件中提供额外的配置项。如下所示 -

<init-param>
    <param-name>jersey.config.server.provider.classnames</param-name>
    <param-value>org.glassfish.jersey.filter.LoggingFilter;
     org.glassfish.jersey.media.multipart.MultiPartFeature</param-value>
</init-param>

让我们看看使用RESTful JAX-RS API上传文件的完整代码。

JAX-RS文件上传

文件：FileUploadService.java -

package com.yiibai.rest;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
import org.glassfish.jersey.media.multipart.FormDataParam;
@Path("/files")
public class FileUploadService {
    @POST
    @Path("/upload")
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    public Response uploadFile(
            @FormDataParam("file") InputStream uploadedInputStream,
            @FormDataParam("file") FormDataContentDisposition fileDetail) {
            String filename = fileDetail.getFileName();
            String files[] = filename.split(":");
            filename = files[files.length-1];
            System.out.println("filename => "+ filename);
            String fileLocation = "D:\" + filename;
            System.out.println("filename => "+ fileLocation);
                    //saving file
            try {
                FileOutputStream out = new FileOutputStream(new File(fileLocation));
                int read = 0;
                byte[] bytes = new byte[1024];
                out = new FileOutputStream(new File(fileLocation));
                while ((read = uploadedInputStream.read(bytes)) != -1) {
                    out.write(bytes, 0, read);
                }
                out.flush();
                out.close();
            } catch (IOException e) {e.printStackTrace();}
            String output = "File successfully uploaded to : " + fileLocation;
            return Response.status(200).entity(output).build();
        }
  }

文件: web.xml -

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    id="WebApp_ID" version="3.0">
    <servlet>
        <servlet-name>Jersey REST Service</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>com.yiibai.rest</param-value>
        </init-param>
        <init-param>
            <param-name>jersey.config.server.provider.classnames</param-name>
            <param-value>org.glassfish.jersey.filter.LoggingFilter;
     org.glassfish.jersey.media.multipart.MultiPartFeature</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Jersey REST Service</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>
</web-app>

文件: index.html -

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JAXRS文件上传示例</title>
</head>
<body>
<h2>JAXRS文件上传示例</h2>
<form action="rest/files/upload" method="post" enctype="multipart/form-data">
       <p>
        选择文件 : <input type="file" name="file" size="45" />
       </p>
       <input type="submit" value="提交上传" />
</form>
</body>
</html>

现在在服务器上运行此应用程序，您将看到以下输出：

选择一个要上传的文件，然后提交上传，得到以下结果 -