我正在使用Restlet并且遇到路由器模板的问题,该模板的模板中的变量包含编码斜杠。以下是详细信息:
当我使用这条路线时:
/blob/sqlserver/{uniqueid}
然后传递(注意%2F是/):
/blob/sqlserver/Refinance-Other%2FFRM%2F660-700%2F4.00-4.50%2Fproperties-4.00-4.50.csv
或者这个:
/blob/sqlserver/Refinance-Other/FRM/660-700/4.00-4.50/properties-4.00-4.50.csv
我得到了404
如果我使用此路由器:
/blob/sqlserver/{purpose}/{type}/{creditscore}/{interestrate}/{file}
并传递:
/blob/sqlserver/Refinance-Other/FRM/660-700/4.00-4.50/properties-4.00-4.50.csv
它有效,但我不能这样做,因为我无法控制谁发送给我这个URI,变量会改变,所以它必须是编码的斜杠。
为了进一步测试,我还尝试了这个模板:
/blob/sqlserver/{uniqueid}
但也使用了MODE_STARTS_WITH
.setMatchingMode(Template.MODE_STARTS_WITH);
当我这样做时,它确实找到了这个:
/blob/sqlserver/Refinance-Other/FRM/660-700/4.00-4.50/properties-4.00-4.50.csv
但我只能得到"再融资 - 其他"作为uniqueid下的变量。
然而,编码的斜杠仍然不起作用,这看起来很奇怪?为什么它适用于上面带有MODE_STARTS_WITH的非编码URI而不是这个URI?:
/blob/sqlserver/Refinance-Other%2FFRM%2F660-700%2F4.00-4.50%2Fproperties-4.00-4.50.csv
答案 0 :(得分:0)
实际上,在它到达我之前,URL编码正在被解码,这两个帖子帮我解决了这个问题。作为证明,双重编码有效:
Is a slash ("/") equivalent to an encoded slash ("%2F") in the path portion of an HTTP URL
ALLOW_ENCODED_SLASH on AWS Elasticbeanstalk
并查看对此票证的第一个回复:
答案 1 :(得分:0)
我对你的用例进行了一些测试,我在Restlet版本2.3.4中为我工作。你使用的是哪个版本?
以下是我使用的代码:
<强>应用强>
public class RestletApplication extends Application {
@Override
public Restlet createInboundRoot() {
Router router = new Router(getContext());
router.attach("/blob/sqlserver/{uniqueid}", TestServerResource.class);
return router;
}
}
服务器资源
public class TestServerResource extends ServerResource {
@Get
public String test() {
String attr = getAttribute("uniqueid");
System.out.println("attr = "+attr);
return "ok";
}
}
<强>客户端强>
public class TestClient {
public static void main(String[] args) {
try {
// Encoded path variable
ClientResource cr1 = new ClientResource(
"http://localhost:8182/blob/sqlserver/Refinance-Other%2FFRM%2F660-700%2F4.00-4.50%2Fproperties-4.00-4.50.csv");
Representation repr1 = cr1.get();
System.out.println(repr1.getText());
// Non encoded path variable
ClientResource cr2 = new ClientResource(
"http://localhost:8182/blob/sqlserver/Refinance-Other/FRM/660-700/4.00-4.50/properties-4.00-4.50.csv");
Representation repr2 = cr2.get();
System.out.println(repr2.getText());
} catch(Exception ex) {
ex.printStackTrace();
}
}
}
对于第一个请求,我获得200状态代码,uniqueid
路径变量的值为Refinance-Other%2FFRM%2F660-700%2F4.00-4.50%2Fproperties-4.00-4.50.csv
。
对于第二个,我得到一个404状态代码,这是正常的,因为在Restlet中没有配置匹配的路由。
希望它可以帮到你, 亨利