【问题标题】:How to properly encode Web API parameter in URL path?如何在 URL 路径中正确编码 Web API 参数?
【发布时间】:2018-12-27 17:22:09
【问题描述】:

我有一个端点用于逐书查找。

书籍参考是可以包含空格和任何特殊字符的字符串,例如mybookmy bookmy-bookmy/bookbook++

// GET api/books/reference/{reference}
[HttpGet("reference/{reference}")]
public ActionResult<BookItem> FindByReference(string reference)

这是我在测试时得到的:

GET api/books/reference/mybook
OK

GET api/books/reference/my book
OK

GET api/books/reference/my-book
OK

GET api/books/reference/my+book
404 Not found

GET api/books/reference/my/book
404 Not found

GET api/books/reference/book++
404 Not found

对这个reference 参数在 URL 路径中 进行编码以便通过路由正确解析的正确方法是什么?这可能吗?

【问题讨论】:

  • 调用者需要正确转义这些字符。
  • 谢谢,但是 - 很奇怪 - 如果我在 my book 上使用 UrlEncode 我会得到 my+book 导致 404。
  • "api/books/reference/my book" 似乎是错误的 - 我希望这会失败,因为空间对路径无效......正如@JDB所说的问题很奇怪 -确实 Uri 需要首先正确构建,因此测试一次无效并没有真正的用处。阅读 RFC(或至少 stackoverflow.com/questions/4669692/…)可能有助于“有效”定义。
  • 您将 url 作为查询参数传递(因为您使用了 UrlEncode)?这更令人困惑。您能否发布一些minimal reproducible example 的客户端代码和处理该查询参数的服务器端代码以调用您的 FindByReference 方法? (通常会使用new Uri("http://fooo/bar var").AbsoluteUri 来表示网址)

标签: c# asp.net-web-api


【解决方案1】:

URL 的编码是调用 API 的客户端的责任,如果客户端想要正确的响应,它必须提供一个有效的 URL。如果您对示例进行编码,您将获得:

GET api/books/reference/mybook

GET api/books/reference/my%20book

GET api/books/reference/my-book

GET api/books/reference/my%2Bbook

GET api/books/reference/my%2Fbook

GET api/books/reference/book%2B%2B

这些现在应该可以工作了。

如果您需要有关实际编码的帮助,您必须使用客户端源代码编辑您的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-28
    • 1970-01-01
    • 2021-07-26
    • 1970-01-01
    • 2021-11-14
    • 2015-08-25
    • 2020-09-20
    相关资源
    最近更新 更多