我有一个为使用数据库创建的RESTful服务。 所需参数是开始日期和时间。结束日期。操作参数是用户名,client-ip&远程IP。
我有这个工作,但想看看是否有更好的实施方式:
这是我的资源类:
@RequestMapping(value = "/usage", method = RequestMethod.GET)
@ApiOperation(value = "Usage Sessions - JSON Body", notes = "GET method for users by date range")
public List<DTO> getUsageByDate(@RequestParam(value = "start-date", required = true) final String startDate,
@RequestParam(value = "end-date", required = true) final String endDate,
@RequestParam(value = "user-name", required = false) final String userName,
@RequestParam(value = "client-ip", required = false) final String clientIp,
@RequestParam(value = "remote-ip", required = false) final String nasIp) throws BadParameterException {
return aaaService.findUsageByDate(startDate, endDate, userName, clientIp,remoteIp);
}
我的DAO实现如下:
public List<DTO> getUsageByDate(String startDate, String endDate, String userName, String localIp, String remoteIp)
throws BadParameterException {
StringBuilder sql = new StringBuilder(
"select * from usage where process_time >= :start_date and process_time < :end_date");
if(userName != null) {
sql.append(" AND user_name = :user_name");
}
if(localIp != null) {
sql.append(" AND local_ip_address = :local_ip");
}
if(remoteIp != null){
sql.append(" AND remote_ip_address = :remote_ip");
}
SqlParameterSource namedParameters = new MapSqlParameterSource().addValue("start_date", startDate)
.addValue("end_date", endDate).addValue("user_name", userName).addValue("local_ip", localIp)
.addValue("nas_ip", remoteIp);
try {
return jdbcTemplate.query(sql.toString(), namedParameters,
new BeanPropertyRowMapper<DTO>(DTO.class));
} catch (EmptyResultDataAccessException e) {
throw new BadParameterException();
}
}
现在任何想法似乎都有点长篇大论。
由于
答案 0 :(得分:1)
使URI的所需参数(开始日期,结束日期)部分和可选参数(user-name,client-ip,remote-ip)使用查询参数。因此,您的URI可能是/usage/05.05.2015/06.06.2016?user-name=Joe
。
不应在DAO中进行用户输入验证。它应该在REST控制器中完成。
如果您使用Java 8,则可以表示哪些参数是可选的以及getUsageByDate
方法签名中哪些参数是必需的:
public List<DTO> getUsageByDate(String startDate, String endDate,
Optional<String> userName, Optional<String> localIp, Optional<String> remoteIp)
您还应验证所提供的参数:
Objects.requireNonNull(startDate);
Objects.requireNonNull(endDate);
您应确保用户提供的日期有效,并且您不应将日期作为字符串传递给DAO。