我有一个RESTful Web服务,使用Java连接到包含汽车的数据库,并使用Postman进行CRUD操作和测试。
目前,当数据库中的汽车成功返回时,它只使用传统的HTTP GET返回状态200ok。
我现在正在尝试实现条件GET,以便在提交第二个GET请求并且尚未从先前的GET请求修改实体时返回状态304。
阅读条件GET,我知道它使用Last-modified和if-modified-since标题,但在如何实现这一点上却很困难。
在db中,我有一个触发器来更新与每个实体相关的TIMESTAMP,并且我认为这将是一个值,它将被检查以查看自上次请求以来该实体是否已被修改?
任何帮助赞赏
当前的GET请求:
@GET
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
@Path("{reg}")
public Response getOneCar(@PathParam("reg") String reg) {
Car car = dao.getCarDetails(reg);
System.out.println("GET CarReg == "+reg);
if(car == null){ // no car with that reg exists
return Response
.status(Response.Status.NOT_FOUND)
.entity("<carNotFound reg='"+reg+"' />")
.build();
}else{
car.setLink(new ArrayList<Link>());
Link linkSelf = new Link();
linkSelf.setRel("self");
linkSelf.setUri(context.getPath());
Link deleteLink = new Link();
deleteLink.setRel("/linkrels/car/delete");
deleteLink.setUri(context.getPath());
Link updateLink = new Link();
updateLink.setRel("/linkrels/car/update");
updateLink.setUri(context.getPath());
car.getLink().add(linkSelf);
car.getLink().add(deleteLink);
car.getLink().add(updateLink);
return Response
.status(Response.Status.OK)
.entity(car)
.build();
}
}
其中一个实体的示例:
<car>
<id>3</id>
<regNo>03G333</regNo>
<make>Ford</make>
<model>Focus</model>
<link rel="self" uri="cars/03G333"/>
<link rel="/linkrels/car/delete" uri="cars/03G333"/>
<link rel="/linkrels/car/update" uri="cars/03G333"/>
<time>2018-03-23 10:00:05.772</time>
</car>
感谢@Andrew的回复,
我目前正在尝试使用“If-Modified-Since”和“Last-Modified”标题执行此操作。
在服务器上我向客户端发送一个“Last-Modified”标头,它从数据库中的当前汽车获取时间戳,如图所示 - > postman server responce
现在我正在尝试配置邮递员发送回“if-Modified-Since”标题。
如果我比较这些值并且根据时间戳相同或不同,我可以确定要发回的响应。
目前无法配置邮递员发送“If-Modified-Since”标题,然后以某种方式在服务器上获取此值。
Date date = null;
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String lastmodifiedDate = car.getTime();
date = sdf.parse(lastmodifiedDate);
} catch (ParseException ex) {
}
return Response
.status(Response.Status.OK).lastModified(date)
.entity(car)
.build();
}
}