我在使用Spring和REST API时遇到了一个有趣的问题,问题是:Spring中的路径是否仅限于一定数量的字符?
代码如下
@RequestMapping(value = {REST_PREFIX + "/{key}"}, method = {RequestMethod.GET})
public DashboardItem getExceptionByKey(@PathVariable("key") String key, HttpServletRequest request, HttpServletResponse httpResponse_p) {
log.info("URL is {}", request.getRequestURL());
log.info("Key is {}", key);
return InspectionUtils.getExceptionByKey(key);
}
密钥的一个例子是
67E4D2C089CBCCA2A9732F6986124C6B10.243.2.107#0EEE5EAB06ED4FFF82A8934F7058860C#79A2F0C170A028A3B0410F0F16303F41
发送请求时,我确保对URL进行编码,在我的程序中,我收到的URL是以下
/rest/exceptions/67E4D2C089CBCCA2A9732F6986124C6B10.243.2.107#0EEE5EAB06ED4FFF82A8934F7058860C#79A2F0C170A028A3B0410F0F16303F41
因此我收到了一个空洞键,但是当它解析它时,变量键只是
67E4D2C089CBCCA2A9732F6986124C6B10.243.2
我认为它可能是特殊字符,但它看起来并不像。我的第二个猜测是路径的长度存在限制。
所以我的问题是,如果路径有限制或是否存在其他问题?
谢谢
答案 0 :(得分:4)
这是某种弹簧约定,它将最后一个点之后的所有内容视为文件扩展名并将其删除。您可以简单地尝试在请求映射和请求中添加尾随/。
即REST_PREFIX + "/{key}/"
如果您不是调用API的人,请查看更复杂但更好的解决方案,请参阅this question
答案 1 :(得分:0)
必须是enum PtzAction : Int {
case up = 1, down, left, right, zoomIn, zoomOut
}
enum PtzButton: Int {
case play = 1, up, stop, left, none, right, zoomIn, down, zoomOut
static let actionRawValues = [0, 1, 0, 3, 0, 4, 5, 2, 6]
}
let button = PtzButton.down
let actionRaw = PtzButton.actionRawValues[button.rawValue - 1] // zero based index
if let action = PtzAction(rawValue: actionRaw) {
print(action.rawValue)
}
中未获得URL编码的哈希#
字符。而且,由于URL中key
之后的任何内容都代表HTML页面的不同片段,因此它永远不会被发送到服务器。
在我的#
上使用javascript' encodeURIComponent()
:
key
请注意,67E4D2C089CBCCA2A9732F6986124C6B10.243.2.107%230EEE5EAB06ED4FFF82A8934F7058860C%2379A2F0C170A028A3B0410F0F16303F41
字符现已编码。试试这个,但您可能需要在服务器上解码它。
答案 2 :(得分:0)
#
字符在网址中具有特殊含义。它是一个片段标识符,用于跳转到页面的某个部分(而不是在顶部着陆)。为避免这种情况,请将字符编码为%23
。