【问题标题】:Understanding REST APIs - What are Context and @Context?了解 REST API - 什么是 Context 和 @Context?
【发布时间】:2016-12-07 18:07:06
【问题描述】:

我最近学习了restful web services教程,但不明白context是什么。有人可以解释它是什么以及 @Context 做了什么吗?

【问题讨论】:

  • 你能澄清一下吗?您是在谈论特定的框架吗?
  • @CássioMazzochiMolin 是的,球衣
  • 那么context是什么意思?你在读什么教程?
  • 那个定义不是很清楚。请检查我的答案。

标签: java web-services jersey


【解决方案1】:

REST 是一种架构风格,也是实现 Web 服务的方式之一。 (其他是 SOAP)。 REST 架构有很多实现,其中一个在 java 中是 Jersey (https://jersey.java.net/) @context 是 Jersey 框架中的注解。这是一个来自 jax rs jar 的类。 (https://jersey.java.net/apidocs-javax.jax-rs/2.0.1/javax/ws/rs/core/Context.html)

【讨论】:

    【解决方案2】:

    有关编程术语中上下文的解释,请查看answer

    JAX-RS API 提供了一个 @Context 注释。通常,此类注解可用于获取与请求或响应相关的上下文 Java 类型。这些类型可以注入到由 JAX-RS 运行时管理的类中。

    例如,要在资源方法中注入HttpServletRequest,您可以执行以下操作:

    @GET
    public Resonse foo(@Context HttpServletRequest request) {
        ...
    }
    

    其他资源:

    【讨论】:

    • 不能直接写HttpServelet req之类的东西,而不是在前面加上@Context,还有什么是上下文?
    • @user3248186 查看我的更新答案。在由 JAX-RS 管理的类中注入 HttpServletRequest 等类型需要 @Context 注解。
    • @user3248186 如果您需要更多详细信息,请告诉我。
    【解决方案3】:

    JAX-RS 提供@Context 注解来注入12个与HTTP请求上下文相关的对象实例,它们是:

    • SecurityContext - 当前 HTTP 请求的安全上下文实例
    • Request - 用于设置前置条件请求处理
    • ApplicationConfigurationProviders -> 提供对 JAX-RS 应用程序、配置和提供程序实例的访问权限
    • ResourceContext - 资源连接类实例
    • ServletConfig - ServletConfig 实例实例
    • ServletContext - ServletContext 实例
    • HttpServletRequest - 当前请求的 HttpServletRequest 实例
    • HttpServletResponse - 当前请求的 HttpServletResponse 实例
    • HttpHeaders - 维护 HTTP 标头键和值
    • UriInfo - 从被调用的 URI 中查询参数和路径变量

    同时拥有 @Inject(或 Spring 中的 @Autowired)和 @Context 做同样的工作有点令人困惑,但希望在下一版本中为 Java EE 带来更多的一致性。在此期间,您将不得不凑合。

    一个有趣的特性是所有这些实例都可以作为字段值或直接注入到资源方法中。

    注入资源方法参数列表的示例:

    @Path("/")
    public class EndpointResource {
    
      @GET
      @Produces(MediaType.APPLICATION_JSON)
      public Response getAllHttpHeaders(final @Context HttpHeaders httpHeaders){
          // Code here that uses httpHeaders
      }
    }
    

    一个注入字段的例子:

    @Path("/")
    public class EndpointResource {
    
      private final @Context HttpHeaders httpHeaders;
    
      @GET
      @Produces(MediaType.APPLICATION_JSON)
      public Response getAllHttpHeaders(){
          // Code here that uses httpHeaders
      }
    }
    

    如果你想了解更多,请看这个系列文章回答问题What is @Conext in JAX-RS used for?

    【讨论】:

      猜你喜欢
      • 2017-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-13
      • 2019-06-26
      • 2011-02-02
      相关资源
      最近更新 更多