2 回答

TA贡献1828条经验 获得超6个赞
我发现另一篇文章包含了一个示例,即在不包含可选参数时提供默认值:
@FunctionName("temps")
public HttpResponseMessage run(
@HttpTrigger(name = "req",
methods = {HttpMethod.GET},
authLevel = AuthorizationLevel.ANONYMOUS,
route = "temps/{method}/{temp=NONE}")
HttpRequestMessage<Optional<String>> request,
@BindingName("method") String method,
@BindingName("temp") String temp,
final ExecutionContext context) {...}
这似乎有效,但它并没有解释为什么其他发布的例子用“?”来指定可选参数(除非它在Java中不起作用,但在C#中起作用)。我还发现,在提供默认值时,您似乎不能同时包含参数类型,例如“{temp**:float**=NONE}”。

TA贡献1794条经验 获得超8个赞
我认为Java中的路由参数存在多个问题。实际上,我在Java中的Azure函数的GitHub存储库中创建了一个关于这个问题的问题,我也必须处理这个问题,不要犹豫,添加更多细节,这样也许它会得到更多的关注:https://github.com/Azure/azure-functions-java-worker/issues/293。
编辑:
这是另一种可能的解决方法,适用于参数类型(实际上,此解决方案仅在指定参数时才有效):使用问号编写参数,但不要使用注释检索它们。相反,请直接在函数中解析 URL。@BindingName
例如:
@FunctionName("example")
public HttpResponseMessage exampleFunction (
@HttpTrigger(
name = "functionTrigger",
authLevel = AuthorizationLevel.ANONYMOUS,
methods = {HttpMethod.GET},
route = "example/{param1:int?}/{param2:int?}" // specify the parameters like this
) final HttpRequestMessage<Optional<String>> request,
final ExecutionContext context
) {
String[] parameters = request.getUri().getPath().split("/"); // though types were specified, with this way of doing you retrieve the parameters as strings
int param1 = 0;
int param2 = 0;
if (parameters.length > 3) {
param1 = Integer.parseInt(parameters[3]);
if (parameters.length > 4) {
param2 = Integer.parseInt(parameters[4]);
}
}
return request.createResponseBuilder(HttpStatus.OK)
.body("You sent " + param1 + " and " + param2)
.build();
}
精度:尽管您将参数检索为字符串,但您在路由路径中指定了类型这一事实会阻止用户发送不同类型的值(如果他们尝试这样做,该函数将自动响应 404 Not Found)。
此外,这就是使此解决方法远非理想解决方案的原因,您必须小心URL路径中的“/”的数量(例如,如果您尚未删除它,请不要忘记域后面的“api”前缀等)。
添加回答
举报