我试图弄清楚如何使用具有简单温度转换功能的Java创建Azure函数。我尝试定义的路线是:
temps / {method} / {temp?}
我使用以下命令修改了为新的Java项目生成的模板化HttpTrigger代码:
@FunctionName("temps")
public HttpResponseMessage run(
@HttpTrigger(name = "req",
methods = {HttpMethod.GET},
authLevel = AuthorizationLevel.ANONYMOUS,
route = "temps/{method}/{temp:float?}")
HttpRequestMessage<Optional<String>> request,
@BindingName("method") String method,
@BindingName("temp") String temp,
final ExecutionContext context) {...}
当我实际将温度值作为最后一个参数传递时,它工作正常,但是如果我仅调用“ temps / {method}”,则在
处会收到 NullPointerException
com.microsoft.azure.functions.worker.binding.BindingDataStore.getTriggerMetatDataByName(BindingDataStore.java:54).
所以我假设我没有正确定义绑定,因此当URI中不包含最后一个参数时,它可以正确处理。我还看到了许多其他相关信息,其中包括“?”应该工作,所以想知道我是否缺少明显的东西。注意:我有代码可以测试在temp中传递的值是否为float值,所以工作正常。
答案 0 :(得分:0)
我发现了另一篇文章,其中提供了一个示例,如果不包含可选参数,则提供默认值:
@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}”。
答案 1 :(得分:0)
我认为Java中的路由参数存在多个问题。 实际上,我在GitHub存储库中为Java中的Azure函数创建了一个关于该问题的问题,我也必须处理该问题,请不要犹豫地添加更多详细信息,以使它得到更多关注:https://github.com/Azure/azure-functions-java-worker/issues/293 。
编辑:
这是另一种可能的解决方法,它适用于参数类型(实际上,此解决方案仅在指定了参数的情况下有效):用问号写参数,但请勿使用@BindingName
注解。而是直接在函数中解析URL。
例如:
@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响应找到)。
此外,这也是使此解决方案偏离理想解决方案的原因,您必须注意URL路径中的“ /”号(例如,不要忘记紧随在“。”之后的“ api”前缀)域(如果您尚未将其删除等)。