如何在同一URI上处理无参数和参数化的REST服务

时间:2019-02-08 19:38:27

标签: rest uri

我正在Spring Boot环境中使用REST服务。我对URI和命名约定有疑问。

(目前)我的控制器实现中具有以下三个映射...

@RequestMapping(method=RequestMethod.GET, value= "/v1/accounts")
public List<Account> getAllAccounts() {
    return accountService.getAllAccounts();
}

@RequestMapping(method=RequestMethod.GET, value="/v1/accounts/{accountId}")
public Account getAccount(@PathVariable int accountId) {
    return accountService.getAccount(accountId);
}

@RequestMapping(method=RequestMethod.GET, value="/v1/accounts/")
public Account getAccount(@RequestParam("shortName") String shortName) {
    return accountService.getAccount(shortName);
}

这些当前“有效”,但是我对getAccount(String)方法有疑问/担忧。如果仅使用路径“ v1 / accounts”,则编译器似乎无法将其与getAllAccounts()的URI区分开。因此,我添加了结尾的“ /”,现在请求看起来像...

/v1/accounts/?shortName=foo

但是,似乎两个请求应该是...

/v1/accounts

/v1/accounts?shortName=foo

但是,正如已经确定的那样,更改第三个请求映射以删除结尾的“ /”会导致编译时错误。

关于(a)如何消除尾随'/'而不会遇到编译时错误的任何输入,或者(b)合并尾随'/'“ just”以公开两个REST服务的建议(I '担心“当需要第三项服务时会发生什么”)?

1 个答案:

答案 0 :(得分:0)

与我们的一位前端开发人员交谈后,他们说最好只处理一种返回类型(即List Vice Vice List和Account),然后简化为...

// external.js
$(function(){ // load
var array1 = ['a', 'b', 1], array2 = ['c', 'd', 2], array3 = ['e', 'f', 3], array4 = ['g', 'h', 4];
var array5 = ['i', 'j', 5], array6 = ['k', 'l', 6], array7 = ['m', 'n', 7];
var arrayOfArrays = [array1, array2, array3, array4, array5, array6, array7];
var content = $('#content'), sel = $('#sel'), out = $('#outcome');
sel.change(function(){
  // .text instead of .html so it is escaped
  out.text(JSON.stringify(arrayOfArrays[$(this).prop('selectedIndex')]));
});
content.css('display', 'block'); // in case you're generating some gui with JavaScript
}); // load end

我已经看到了有关使用“可选”作为参数类型的一些担忧,但是它似乎确实(a)清理了REST端点的URI,并且(b)在控制器实现中并不可怕。

除非有人指出与这种方法相关的“巨大,意想不到的噩梦”,否则我认为我会坚持下去