在 Java Azure 函数中使用可选参数的正确方法

我正在尝试弄清楚如何使用具有简单温度转换函数的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}”,我会在



com.microsoft.azure.functions.worker.binding.BindingDataStore.getTriggerMetatDataByName(BindingDataStore.java:54). 


因此,我假设我没有正确定义绑定,以便在最后一个参数未包含在URI中时可以正确处理。我看过一些关于此的其他帖子,这些帖子表明包括“?”应该有效,所以想知道我是否错过了一些明显的东西。注意:我有代码来测试在temp中传递的值是否是值浮点数,所以这工作正常。


Smart猫小萌
浏览 120回答 2
2回答

30秒到达战场

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

慕田峪9158850

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

相关分类

Java