标签: jax-rs

使用JAX-RS和Jersey进行基于REST令牌的身份验证的最佳实践

我正在寻找一种在Jersey中启用基于令牌的身份验证的方法.我试图不使用任何特定的框架.那可能吗?

我的计划是:用户注册我的Web服务,我的Web服务生成令牌,将其发送到客户端,客户端将保留它.然后,对于每个请求,客户端将发送令牌而不是用户名和密码.

我在考虑为每个请求使用自定义过滤器,@PreAuthorize("hasRole('ROLE')") 但我只是认为这会导致很多请求数据库检查令牌是否有效.

或者不创建过滤器并在每个请求中放置一个参数令牌?这样每个API首先检查令牌,然后执行一些东西来检索资源.

java authentication rest jax-rs jersey-2.0

437
推荐指数
2
解决办法
32万
查看次数

无效数据的REST响应代码

在以下情况下,应将哪些响应代码传递给客户端?

  1. 用户注册时传递的数据无效,如错误的电子邮件格式
  2. 用户名/电子邮件已存在

我选择了403.我也发现以下我认为可以使用.

维基百科:

412前提条件失败:服务器不满足请求者对请求提出的前提条件之一

如果我应该使用除403以外的代码,建议代码.

rest http jax-rs

263
推荐指数
4
解决办法
16万
查看次数

何时使用@QueryParam vs @PathParam

我不是在问这里已经问过的问题: @PathParam和@QueryParam之间有什么区别

这是"最佳实践"或惯例问题.

当你使用@PathParamVS @QueryParam.

我能想到的是,决定可能是使用二者来区分信息模式.让我在下面说明我的LTPO - 不完美的观察.

PathParam的使用可以保留用于信息类别,这可以很好地落入信息树的分支中.PathParam可用于深入到实体类层次结构.

而QueryParam可以保留用于指定属性以定位类的实例.

例如,

  • /Vehicle/Car?registration=123
  • /House/Colonial?region=newengland

/category?instance

@GET
@Path("/employee/{dept}")
Patient getEmployee(@PathParam("dept")Long dept, @QueryParam("id")Long id) ;
Run Code Online (Sandbox Code Playgroud)

VS /category/instance

@GET
@Path("/employee/{dept}/{id}")
Patient getEmployee(@PathParam("dept")Long dept, @PathParam("id")Long id) ;
Run Code Online (Sandbox Code Playgroud)

VS ?category+instance

@GET
@Path("/employee")
Patient getEmployee(@QueryParam("dept")Long dept, @QueryParam("id")Long id) ;
Run Code Online (Sandbox Code Playgroud)

我不认为有这样做的标准惯例.在那儿?但是,我想知道人们如何使用PathParam与QueryParam来区分他们的信息,就像上面举例说明的那样.我也很想听听练习背后的原因.

java rest jax-rs

257
推荐指数
8
解决办法
34万
查看次数

JAX-RS - 如何将JSON和HTTP状态代码一起返回?

我正在编写REST Web应用程序(NetBeans 6.9,JAX-RS,TopLink Essentials)并尝试返回JSON HTTP状态代码.我已准备好代码并且在从客户端调用HTTP GET方法时返回JSON.实质上:

@Path("get/id")
@GET
@Produces("application/json")
public M_?? getMachineToUpdate(@PathParam("id") String id) {

    // some code to return JSON ...

    return myJson;
}
Run Code Online (Sandbox Code Playgroud)

但是,我想用JSON数据一起返回的HTTP状态代码(500,200,204,等).

我试着用HttpServletResponse:

response.sendError("error message", 500);
Run Code Online (Sandbox Code Playgroud)

但这使得浏览器认为它是"真正的"500,因此输出网页是一个常规的HTTP 500错误页面.

我想返回一个HTTP状态代码,以便我的客户端JavaScript可以根据它处理一些逻辑(例如在HTML页面上显示错误代码和消息).这是可能的还是HTTP状态代码不能用于此类事情?

java rest jax-rs http-status-codes

237
推荐指数
8
解决办法
45万
查看次数

JAX-RS/Jersey如何自定义错误处理?

我正在使用Jersey学习JAX-RS(又名JSR-311).我已经成功创建了一个Root资源并正在使用参数:

@Path("/hello")
public class HelloWorldResource {

    @GET
    @Produces("text/html")
    public String get(
        @QueryParam("name") String name,
        @QueryParam("birthDate") Date birthDate) {

         // Return a greeting with the name and age
    }
}
Run Code Online (Sandbox Code Playgroud)

这很好用,并处理当前语言环境中的任何格式,日期(字符串)构造函数(如YYYY/mm/dd和mm/dd/YYYY)可以理解这种格式.但是,如果我提供的值无效或无法理解,我会得到404响应.

例如:

GET /hello?name=Mark&birthDate=X

404 Not Found
Run Code Online (Sandbox Code Playgroud)

我该如何自定义此行为?也许是一个不同的响应代码(可能是"400 Bad Request")?记录错误怎么样?也许在自定义标题中添加问题描述("错误日期格式")以帮助排除故障?或者返回包含详细信息的完整错误响应以及5xx状态代码?

java rest error-handling jax-rs jersey

210
推荐指数
6
解决办法
16万
查看次数

URL矩阵参数与请求参数

我想知道是否在我的URL中使用矩阵或查询参数.我发现对该主题的旧讨论并不令人满意.

例子

乍一看,矩阵参数似乎只有优势:

  • 更具可读性
  • 不需要在XML文档中编码和解码"&"
  • 带"?"的网址 在很多情况下都没有缓存; 具有矩阵参数的URL被缓存
  • 矩阵参数可以出现在路径中的任何位置,并且不限于其末尾
  • 矩阵参数可以有多个值: paramA=val1,val2

但也有缺点:

  • 只有少数像JAX-RS这样的框架支持矩阵参数
  • 当浏览器通过GET提交表单时,params成为查询参数.因此它最终会出现两种相同任务的参数.为了不混淆REST服务的用户并限制服务开发人员的工作量,在这个领域中使用始终查询参数会更容易.

由于服务的开发人员可以选择支持矩阵参数的框架,因此唯一的缺点是浏览器默认创建查询参数.

还有其他缺点吗?你会怎么做?

parameters rest url http jax-rs

170
推荐指数
3
解决办法
6万
查看次数

如何在RESTful POST方法中访问参数

我的POST方法如下所示:

@POST
@Consumes({"application/json"})
@Path("create/")
public void create(String param1, String param2){
    System.out.println("param1 = " + param1);
    System.out.println("param2 = " + param2);
}
Run Code Online (Sandbox Code Playgroud)

当我在Netbeans中创建Jersey客户端时,调用post方法的方法如下所示:

public void create(Object requestEntity){
    webResource.path("create").type(MediaType.APPLICATION_JSON).post(requestEntity);
}
Run Code Online (Sandbox Code Playgroud)

运行此测试时:

@Test
public void hello(){
    String json = "{param1=\"hello\",param2=\"hello2\"}";
    this.client.create(json);
}
Run Code Online (Sandbox Code Playgroud)

它在服务器中提供以下输出:

INFO: param1 = {param1="hello",param2="hello2"}
INFO: param2 = 
Run Code Online (Sandbox Code Playgroud)

我需要更改什么才能使参数给出正确的值?

java rest web-services jax-rs jersey

118
推荐指数
1
解决办法
29万
查看次数

JAX-RS和Spring Rest之间的区别

我混淆了JAX-RS之间的区别(好吧,也许应该使用Jersey进行比较,因为JAX-RS只是规范)和Spring for Restful服务.我试图在网上搜索更多信息,它变得更加混乱.我的公司正在使用Spring MVC来开发Restful API

令人困惑的部分是,JAX-RS代表用于RESTful Web服务的Java API,在Spring中我也使用java来开发RESTful Web服务,所以我实际上并没有得到差异.Spring是否遵循JAX-RS规范?

据我所知,直到现在:

  1. JAX-RS是一个蓝图/规范,它有Jersey,RESTeasy等作为实现.

jax-rs spring-mvc jersey

113
推荐指数
4
解决办法
5万
查看次数

Java 8 LocalDate Jackson格式

对于java.util.Date,当我这样做

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd/MM/yyyy")  
  private Date dateOfBirth;
Run Code Online (Sandbox Code Playgroud)

然后在我发送的JSON请求中

{ {"dateOfBirth":"01/01/2000"} }  
Run Code Online (Sandbox Code Playgroud)

有用.

我应该如何为Java 8的LocalDate字段执行此操作?

我试过了

@JsonDeserialize(using = LocalDateDeserializer.class)  
@JsonSerialize(using = LocalDateSerializer.class)  
private LocalDate dateOfBirth;  
Run Code Online (Sandbox Code Playgroud)

它没用.

有人可以让我知道这是正确的方法吗?

以下是依赖项

<dependency>
    <groupId>org.jboss.resteasy</groupId>
    <artifactId>jaxrs-api</artifactId>
     <version>3.0.9.Final</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.jaxrs</groupId>
    <artifactId>jackson-jaxrs-json-provider</artifactId>
    <version>2.4.2</version>
</dependency>
<dependency>
    <groupId>com.wordnik</groupId>
    <artifactId>swagger-annotations</artifactId>
    <version>1.3.10</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

java json jax-rs resteasy jackson

110
推荐指数
12
解决办法
15万
查看次数

使用JERSEY输入和输出二进制流?

我正在使用Jersey实现一个主要检索和提供JSON编码数据的RESTful API.但我有一些情况需要完成以下事项:

  • 导出可下载的文档,例如PDF,XLS,ZIP或其他二进制文件.
  • 检索多部分数据,例如一些JSON和上传的XLS文件

我有一个基于JQuery的单页Web客户端,它可以为这个Web服务创建AJAX调用.目前,它不进行表单提交,并使用GET和POST(使用JSON对象).我应该使用表单发送数据和附加的二进制文件,还是可以使用JSON plus二进制文件创建多部分请求?

我的应用程序的服务层当前在生成PDF文件时创建ByteArrayOutputStream.通过Jersey将此流输出到客户端的最佳方法是什么?我已经创建了一个MessageBodyWriter,但我不知道如何从Jersey资源中使用它.这是正确的方法吗?

我一直在查看泽西岛附带的样本,但还没有找到任何说明如何做这些事情的东西.如果重要的是,我正在使用泽西与杰克逊做没有XML步骤的对象 - > JSON,并没有真正使用JAX-RS.

java jax-rs jersey

109
推荐指数
8
解决办法
14万
查看次数