`

返回信息给Consumer

 
阅读更多

return four types of Java constructs:

  • common Java types return basic information with HTTP return codes determined by the JAX-RS runtime;
  • JAXB objects return complex information with HTTP return codes determined by the JAX-RS runtime;
  • JAX-RS Response objects return complex information with a programmatically determined HTTP return  status.    The Response object also allows HTTP headers to be specified;
  • JAX-RS GenericEntity objects return complex information with HTTP return codes determined by the JAX-RS runtime. The GenericEnitity object provides more information to the runtime components serializing the data.

1. Returning plain Java constructs

     通常情况下,resource class返回一个标准的Java Type, 一个JAXB对象,或者任何的对象(应用程序有对应的Entity

     Provider);在这种情况下,运行环境将使用返回的对象来决定MIME type信息,运行环境也决定使用适合的HTTP

     Code发送给Consumer.

     (1) Returnable types: 可以是null或者是:Java 原生类型,Java原生类型的Numbet representations, JAXBObject.

     (2) MIME types: 运行环境决定返回Entiy 的MIME type首先检查resource method 和 resource class的@Produce

     注解;如果找到一个,将使用注解中指定的MIME type,如果没有找到,将依赖与Entity Provider来决定适合的

     MIME Type.默认情况下,运行环境分配MIME Type按照下面的方式进行:

  •      Java primitives 和她们的Number representations被赋予MIME Type:application/octet-stream;
  •      JAXB objects被赋予MIME Type:application/xml.

     (3) Response codes

     如果resource method完成处理时没有抛出异常并且返回了Plain Java Constructs时,运行环境将自动设置response

     status code:

  •      204(No Content)—the resource method's return type is void
  •      204(No Content)—the value of the returned entity is null
  •      200(OK)—the value of the returned entity is not null

2. Basics of building responses

    Response  Object 包装了返回给Consumer的Entity,该对象使用ResponseBuilder工厂类进行实例化。

    获取Reponse Builder: 有两种方法:

    (1) 使用Response类的静态方法:

import javax.ws.rs.core.Response;

Response r = Response.ok().build();

    (2) 使用ResponseBuilderImpl类

import javax.ws.rs.core.Response;
import org.apache.cxf.jaxrs.impl.ResponseBuilderImpl;

ResponseBuilderImpl builder = new ResponseBuilderImpl();
builder.status(200);
Response r = builder.build();

3. Creating responses for common use cases

     (1) Creating responses for successful requests

     例如:下面的例子返回HTTP Status 200并包含一个Entity:Customer:

import javax.ws.rs.core.Response;
import demo.jaxrs.server.Customer;

Customer customer = new Customer("Jane", 12);
return Response.ok(customer).build();

     如果希望返回值是200,但没有Content,可以使用Response.noContent() method:    

import javax.ws.rs.core.Response;

return Response.noContent().build();

     (2) Creating responses for redirection

     Response Class 提供了method用于处理redirection response statuses:

     A. 303 See Other:当request resource需要用久的重定向consumer至一个新的resource时,使用Response类的

     seeOther() method;

     B. 304 Not Modified:当request resource没有改变时,使用notModified() method;

import javax.ws.rs.core.Response;

return Response.notModified().build();

     C. 307 Temporary Redirect:当request resource需要引导consumer至一个新的resource,但是想consumer继续

     使用这个resource来处理未来的request时,使用temporaryRedirect() method.

     (3) Creating responses to signal errors

     Response Class提供了类处理两个基本的Error:

     A. serverError()(): Status of 500 Internal Server Error;

     B. notAcceptable()(java.util.List<javax.ws.rs.core.Variant> variants): 创建一个Reponse,有406 Status Code和一

     个Entity(包含a list of acceptable resource types).

import javax.ws.rs.core.Response;

return Response.serverError().build();

4. Handling more advanced responses

    (1) Adding custom headers

import javax.ws.rs.core.Response;
import org.apache.cxf.jaxrs.impl.ResponseBuilderImpl;

ResponseBuilderImpl builder = new ResponseBuilderImpl();
builder.header("username", "joe");
Response r = builder.build();

     (2) Adding a cookie

import javax.ws.rs.core.Response;
import javax.ws.rs.core.NewCookie;

NewCookie cookie = new NewCookie("username", "joe");
Response r = Response.ok().cookie(cookie).build();

     (3) Setting the response status

import javax.ws.rs.core.Response;
import org.apache.cxf.jaxrs.impl.ResponseBuilderImpl;

ResponseBuilderImpl builder = new ResponseBuilderImpl();
builder.status(404);
Response r = builder.build();

     (4) Setting cache control directives

import javax.ws.rs.core.Response;
import javax.ws.rs.core.CacheControl;
import org.apache.cxf.jaxrs.impl.ResponseBuilderImpl;

CacheControl cache = new CacheControl();
cache.setNoCache(true);
ResponseBuilderImpl builder = new ResponseBuilderImpl();
builder.cacheControl(cache);
Response r = builder.build();

5. Returning entities with generic type information

    如果应用程序需要更多的控制返回对象的MIME Type或者Entity Provider序列化Reponse, JAX-RS类

    javax.ws.rs.core.GenericEntity<T>提供了更细粒度的控制。

    Creating a GenericEntity<T> object

    有两种方法:

    A. 使用将被包装的Entity来创建GenericEntity<T>的子类:

import javax.ws.rs.core.GenericEntity;

List<String> list = new ArrayList<String>();

GenericEntity<List<String>> entity = new GenericEntity<List<String>>(list) {};
Response response = Response.ok(entity).build();

     B. 使用Entity的Generic Type信息直接创建Instance:

import javax.ws.rs.core.GenericEntity;

AtomicInteger result = new AtomicInteger(12);

GenericEntity<AtomicInteger> entity = new GenericEntity<AtomicInteger>(result,
result.getClass().getGenericSuperclass());
Response response = Response.ok(entity).build(); 
分享到:
评论

相关推荐

    laravel-api-consumer

    您可以为每个要使用的API服务生成一个Consumer。 每个使用者可以具有多个形状的任意数量的端点。 端点表示例如REST API上的资源,例如/ users。 端点返回“形状集合”。 您可以在此处对API提供的方法进行建模。 ...

    kinesis-stream-consumer:用于构建来自Amazon Web Services(AWS)Kinesis流的流事件的强大AWS Lambda使用者的实用程序

    kinesis-stream-consumer v2.1.9 ...kpl-deagg-async.js模块副本kpl-deagg.js一个新的承诺,返回deaggregateAsync基于函数deaggregate作用 依存关系 aws-stream-consumer-core模块-此Kinesis流使用者模块使用的通

    blu-twit:Twit 模块的包装器,它使用 Bluebird 承诺库添加返回承诺的 `getAsync` 和 `postAsync` 方法

    蓝智Twit 模块的包装器,它使用 Bluebird 承诺库添加返回承诺的getAsync和postAsync方法用法由于 Twit 回调返回多个值,我们使用 Bluebird 的spread函数使事情变得更容易: var BluTwit = require ( './blu-twit.js'...

    laravel-api-consumer-showcase

    black-bits / laravel-api-consumer包的展示这是包的示例实现。 它通过使用两个简单的API演示了当前实现的功能... 我们利用我们的通过符号或名称过滤/搜索公司JSONPlaceholder API提供了直接返回演示数据的REST API。

    node_producer_consumer_challenge

    node_producer_consumer_challenge 构建一个简单的生产者/消费者系统。 在这个系统中,Generator 会发送一系列随机的算术表达式,而 Evaluator 会接受这些表达式,计算结果,然后将解决方案报告给 Generator。 要求...

    python3实现从kafka获取数据,并解析为json格式,写入到mysql中

    项目需求:将kafka解析来的日志获取到数据库的变更记录,...consumer_group=test100 passwd = tracking port = 3306 host = xxxxxxxxxx user = track schema = track dd_socket = dd_host = xxxxxxxxxxxx dd_port = 330

    alt-text-consumer

    Create React App入门该项目是通过引导的。... eject ,您将无法返回! 如果您对构建工具和配置选择不满意,则可以随时eject 。 此命令将从您的项目中删除单个生成依赖项。 相反,它将所有配置文件和传递依赖项(webpac

    consumer-redux-app

    eject ,您将无法返回! 如果您对构建工具和配置选择不满意,则可以随时eject 。 此命令将从您的项目中删除单个生成依赖项。 而是将所有配置文件和传递依赖项(Webpack,Babel,ESLint等)直接复制到

    dubbo用户指南(高清版)

    Dubbo是Alibaba开源的分布式服务框架,我们可以...只选择最快一个返回响应的,然后将调用结果返回给服务消费方(Consumer),显然这种方式是以冗余服务为基础的,需要消耗更多的资源,但是能够满足高实时应用的需求。

    producer-consumer-challenge

    在此系统中,生成器将发送一系列随机算术表达式,而评估器将接受这些表达式,计算结果,然后将解决方案报告给生成器。 要求 至少,我们希望看到以下实现: 生产者和消费者作为单独的NodeJS服务。 生产者生成两个...

    expression-consumer:使用随机生成的两个正整数之间的加法表达式并返回响应

    表达式消费者 一个RESTful服务的Node.js写消耗的另外的表达,评估并报告解决方案回生产者。 要求 用于运行测试的 (可选) 安装 克隆此存储库,或将源下载为 .zip 存档 cd进入克隆目录或解压存档 ...

    pg_consumer_admin_web

    eject ,您将无法返回! 如果您对构建工具和配置选择不满意,则可以随时eject 。 此命令将从您的项目中删除单个生成依赖项。 相反,它将所有配置文件和传递依赖项(webpack,Babel,ESLint等)直接复

    dubbo相关资料,学习,指南

    只选择最快一个返回响应的,然后将调用结果返回给服务消费方(Consumer),显然这种方式是以冗余服务为基础的,需要消耗更多的资源,但是能够满足高实时应用的需求。 有关Dubbo服务框架的简单使用,可以参考我的其他...

    lti_consumer

    Create React App入门 ... eject ,您将无法返回! 如果您对构建工具和配置选择不满意,则可以随时eject 。 此命令将从项目中删除单个构建依赖项。 相反,它将所有配置文件和传递依赖项(webpack,Babel,ESL

    api-consumer:初始提交

    用户界面-视图和网络Spring MVC-用于Thymeleaf视图返回的控制器和全局异常管理器Thymeleaf-使用html模板简化Spring bean支持的表单。 Spring验证-Hibernate验证器用于验证用户创建表单和货币转换表单。 这是使用验证...

    twit-promise:Twit模块的包装器,其getpost方法返回本机Promise

    模块的包装器,其get / post方法返回本机 用法 当Twit回调返回多个值时,我们使用then函数使事情变得简单: var Twit = require ( 'twit-promise' ) ; var T = new Twit ( { consumer_key : '...' , consumer_...

    producer-consumer:InVision代码挑战-全栈

    在此系统中,生成器将发送一系列随机算术表达式,而评估器将接受这些表达式,计算结果,然后将解决方案报告给生成器。 项目要求 至少,我们希望看到以下实现: 生产者和消费者作为单独的NodeJS服务。 生产者生成...

    producer-consumer

    在此系统中,生成器将发送一系列随机算术表达式,而评估器将接受这些表达式,计算结果,然后将解决方案报告给生成器。 要求 至少必须执行以下操作: 生产者和消费者作为单独的NodeJS服务。 生产者生成两个正整数...

    woocommerce_dart:与WooCommerce REST API交互的dart程序包

    然后,它进行调用并将数据返回给调用函数。 例子 GET请求(获取产品) Future getProducts () async { // Initialize the API WooCommerceAPI wooCommerceAPI = WooCommerceAPI ( url : ...

    dailymile-client:从 code.google.compdailymile-client 自动导出

    #身份验证 身份验证过程使用 [ OAuth]。... // 将veryifcationToken 设置为从用户身份验证返回的令牌,该令牌作为参数提供给您的回调网址。 token.getProvider().retrieveAccessToken(token.getCon

Global site tag (gtag.js) - Google Analytics