【问题标题】:What is colon in a request uri?请求 uri 中的冒号是什么?
【发布时间】:2021-05-28 16:10:12
【问题描述】:

在 Micronaut 应用程序中编写了一个端点,如下所示:

@Post("/{someId}:verb")

我想从 POSTMAN 向它发出 POST 请求,但不知道我是如何做到的?到目前为止,我已经尝试过:

POST http://localhost:8080/1234/verb // 404 (Not Found)
POST http://localhost:8080/1234:verb // this combines ':' with 1234 and that in turn fails that @Pattern validation that I have placed. 
POST http://localhost:8080/1234 // 405 (Method Not Allowed)

【问题讨论】:

  • 在您的示例中,您输入了vert,而不是verb。也许这就是它失败的原因?
  • 对不起,这是我修复的类型
  • 我希望第二个 localhost:8080/1234:verb 应该匹配,并且您的控制器参数 someId 将设置为 1234。您是说这不会发生吗?我看不到您指的是什么模式验证器。我认为默认值是变量,而不是 URL。所以 :verb 在这里应该只是 URL 的静态部分。

标签: java micronaut


【解决方案1】:

我引用了 Micronaut 文档(我添加的亮点):

请记住,要在占位符表达式中指定默认值, 你应该使用冒号: 字符,但是如果你是默认的 试图指定有一个冒号,那么你应该用 倒计时。

因此,如果未设置 someId,您可能需要将 verb 替换为默认值。

当您的 POST 请求中提供someId 时,该方法将使用someId。否则它将使用默认值,即 verb 根据您的示例。因此,如果您使用 POSTMAN 进行测试,请设置 id 或将其留空,以测试默认值。

【讨论】:

  • 用户 我也试过了。当我这样做时,我得到405 (Method Not Allowed)
  • 然后检查你的URI,路径看起来不完整。
  • 你的控制器叫什么?比如http://localhost:8080/book/1234,如果你有BookController。如果您忽略1234,将返回默认书籍,例如如果你定义了书 #5 (@Post("/{someId}:5"))。
  • 关于注入默认值等,我非常了解 ':' 的概念。由于某种原因,它不起作用,它只是返回我之前提到的那些错误代码。
  • @Post("/{someId}:verb") 中,: 在花括号之外。我不认为这是一个默认值分隔符。
【解决方案2】:

希望我没有误解您的问题(--> 您不是在寻找 someId 的默认值吗?),但以下代码适用于 cURL(someId 可以是字符串或整数 -你更喜欢什么):

package com.example;

import io.micronaut.http.MediaType;
import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.PathVariable;
import io.micronaut.http.annotation.Post;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Controller("/")
public class DemoController {

    private static final Logger logger = LoggerFactory.getLogger(DemoController.class);

    @Post(value = "/{someId}:verb", produces = MediaType.TEXT_PLAIN)
    public String postMethod(@PathVariable String someId) {
        String message = "You called me with the value: " + someId;
        logger.info(message);
        return message;
    }
}

卷曲:

.\curl.exe -X POST http://localhost:8080/WeLoveCake42:verb
.\curl.exe -X POST http://localhost:8080/12345678:verb

输出:

20:14:42.027 [default-nioEventLoopGroup-1-5] INFO  com.example.DemoController - You called me with the value: WeLoveCake42
20:15:37.989 [default-nioEventLoopGroup-1-7] INFO  com.example.DemoController - You called me with the value: 12345678

如果我误解了你的问题:

  • 我在@PathVariable 上使用defaultValue 运气不佳
  • 我没有运气创造价值someId@Nullable

我猜路由/调度器不够灵活,无法检测到这种模式(也许它甚至可能导致不确定的行为,所以这是可以理解的)。

【讨论】:

    猜你喜欢
    • 2019-09-14
    • 1970-01-01
    • 2012-09-25
    • 2016-05-16
    • 2011-03-01
    • 2012-06-06
    • 2012-10-09
    • 2020-05-21
    • 1970-01-01
    相关资源
    最近更新 更多