问题标签 [uritemplate]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
11 回答
29809 浏览

http - 当需要一些复杂的参数时,设计 HTTP 请求的最佳方法是什么?

我有一些我正在编写的 Web 服务,并且我正在尝试尽可能地 RESTful。我使用在 IIS/ASP.NET/SharePoint 内运行的 HTTPHandler 托管这些 Web 服务。

我的大多数服务都需要 HTTP GET。我有两个只是返回一些数据(即查询)并且将是Idempotent,但参数可能有些复杂。它们都可以在服务的参数中包含至少在 URL 的 PATH 部分中不允许使用的字符。

使用 IIS、ASP.NET 和 SharePoint,我发现 URL 路径中的以下字符甚至无法到达我的 HttpHandler,即使 Url 编码(请求爆炸了,我对此没有任何简单的控制) :

  • % (%25)
  • & (%26)
  • * (%2a, 但没有 Url 编码)
  • + (%2b)
  • : (%3a)
  • < (%3c)
  • (%3e)

以下字符进入了我的 HttpHandler,但即使 Url 编码,UriTemplate 也无法正确处理它们:

  • (%23)

  • . (%2e,但没有 Url 编码;UriTemplate 删除了“。”如果是 / 之前的最后一个字符)
  • ? (%3f)
  • /(%2f - UriTemplate 因明显原因而失败,即使 UrlEncoded 也是如此)
  • \ (%5c)

所以,我已经有些彻底,但我需要在查询字符串中测试这些 url 编码的字符。看来这将在那里大部分工作。

在我的一项服务中,作为参数的特殊字符在语义上是查询/过滤器的一部分(实际上是搜索服务的搜索词),但在另一项服务中,它们并不是查询/过滤器的一部分,因此理想情况下它们是路径而不是查询字符串。

我的问题是,什么选择是最好的?以下是我知道的一些:

  1. 使用 HTTP GET 和查询字符串。 任何可能使用特殊字符的内容都应该在查询字符串上并进行 Url 编码。 这是我倾向于的地方,但我担心查询字符串过长(IE 有 2083 个限制)

  2. 在路径中使用 HTTP GET 和 base64 编码。 对于可能使用特殊字符的任何参数,请使用修改后的 Base64 作为 URL,并在首选时将它们保留为路径的一部分。 我试过这个并且它有效,但它有点难看。仍然担心极长的查询字符串。

  3. 使用 HTTP POST 和消息正文。 任何可能使用特殊字符的内容都应该在请求的正文中。 似乎是一个不错的解决方案,但是帖子被理解为不是的,并且(我认为)通常是为了更改(而这里没有发生更改)。

  4. 使用 HTTP GET 和消息正文。 任何可能使用特殊字符的内容都应该在请求的正文中。根据SO:HTTP GET with request bodyRoy Fielding这似乎是个坏主意。

  5. 根据请求的大小,使用 #3 和上面的 #1 或 #2 的组合。

  6. 其他???

请注意,在某些情况下,我可能能够改变一些东西以防止特殊字符(我可能会这样做),但我无法在所有情况下都这样做。


关于 URI 长度,RFC2616 Sec3.2.1说明如下:

HTTP 协议对 URI 的长度没有任何先验限制。服务器必须能够处理它们所服务的任何资源的 URI,并且如果它们提供可以生成此类 URI 的基于 GET 的表单,则应该能够处理无限长度的 URI。如果 URI 比服务器可以处理的长(参见第 10.4.15 节),服务器应该返回 414(Request-URI Too Long)状态。

此外,Internet Explorer 中的最大 URL 长度为 2,083 个字符

相关:如何在 REST 中传递复杂的查询?

0 投票
2 回答
989 浏览

wcf - WCF 休息帮助页面

如何将 WCF REST 服务 UriTemplate 更新为 www.mysite.com/... 而不是系统名称http://mysystem/ ...

当我转到服务帮助页面时,我看到了系统名称,我不希望最终用户看到它。

http://myServerName.local/WCF/Svc.svc/blah/function

我想看看

http://www.mysite.com/WCF/Svc.svc/blah/function

我想这是我可以在 web.config 中更新的东西吗?

0 投票
1 回答
2728 浏览

.net - WCF UriTemplate 不会匹配带有斜杠(/'s)的单个字符串参数

这是场景,我有一个 WCF 服务调用,它采用一个字符串参数,并且该字符串中有斜线(例如“123/456.xml”)。我想设置一个像这样“/{file}”的 UriTemplate,以便我可以访问http://www.example.com/File.svc/123/456.xml而不是http://www.example上的方法.com/File.svc/GetFile?file=123/456.xml

这可能与 UriTemplate 吗?

  • 我意识到我可以设置一个像“/{directory}/{file}”这样的 UriTemplate 但这不是一个选项,因为目录的数量是可变的。
0 投票
1 回答
1327 浏览

wcf - UriTemplateTable 不区分动词

我试图用WCF REST Contrib在 .NET 3.5 中设计一个 REST 服务。我的服务几乎可以正常工作,但我面临一个奇怪的错误。

基本上,我有两种方法:

但是我在激活时收到错误消息:

System.InvalidOperationException 未被用户代码处理 Message="UriTemplateTable 不支持具有与模板'/books?id={identity}' 等效路径但具有不同查询字符串的多个模板,其中查询字符串不能全部通过文字值消除歧义.有关更多详细信息,请参阅 UriTemplateTable 的文档。” 来源="系统.ServiceModel.Web"

如果我重命名第二种方法,/books2?identity那么它可以正常工作。

知道为什么UriTemplateTable不区分动词吗?

0 投票
5 回答
46752 浏览

wcf - WCF中URITemplate中的可选查询字符串参数?

我正在 WCF 4.0 中开发一些 RESTful 服务。我有一个方法如下:

因此,如果我将浏览器导航到http://localhost:8000/Service/Test?format=XML&records=10,那么一切正常。

但是,我希望能够导航到http://localhost:8000/Service/Test?format=XML并省略 URL 的“&records=10”部分。但是现在,我收到一个服务错误,因为 URI 与预期的 URI 模板不匹配。

那么如何为我的一些查询字符串参数实现默认值呢?例如,如果该部分不在查询字符串中,我想将“记录”默认为 10。

0 投票
1 回答
114 浏览

c# - 长而复杂的 URI

我有一个网络服务可以访问网络上的某些资源。该服务有一个方法来查找资源并返回资源的路径。另一种方法,使用此路径发送请求到 Web 服务。

我尝试将整个 UNC 路径(用HttpServerUtlility.UrlTokenEncode方法编码)传递给 web 服务。生成的 URI 很长(331 个字符),我得到“HTTP 400 Bad Request”。

如何处理这么长的 URI?如果我的 URI 短了大约 10 个字符,那么请求就会通过。不幸的是,URI 的大小是可变的,在某些情况下可能更大。我需要做哪些改变?配置文件中是否有任何设置允许长 URI?

0 投票
1 回答
1418 浏览

wcf - 无法将“%26”传递给 WCF 服务中的 WebGet UriTemplate 变量?

我有一个具有此声明操作的 WCF 服务:

但是,当尝试调用 URL 时Test/You%26Me,IIS 返回错误:

我的目标是通过 URL-Encoding: %26 在 URI 中使用 & 符号

通配符没有帮助。有没有办法在不禁用安全功能的情况下防止这个错误?

0 投票
3 回答
3351 浏览

spring - 使用 Spring RESTTemplate 时停止 URITemplate 扩展

我正在使用 Spring RestTemplate 调用 Apache Solr 索引。我手动形成一个请求字符串,并且不提供任何有意的 {variable_name} 模板扩展变量。查询的一部分是术语 {!lucene q.op=OR}。不幸的是,URITemplate 引擎会将此作为 restTemplate.getForObject 调用的一部分进行处理。

理想情况下,我想停止此处理。是否可以转义 { } 字符以使 URITemplate 不处理它们?我已经尝试对字符进行编码,但 RestTemplate 假定一个未编码的字符串,因此它们被编码两次并在后端导致 400:错误请求。

示例网址:

http://localhost/solr/select?q= {!lucene q.op=OR}se_genbanklocus:* se_gb_create:* se_gb_update:* se_clone_name:* se_sample_tissue:*&facet=true&facet.limit=3&facet.mincount=1&facet.field= se_sample_tissue&facet.field=se_sample_tissue_name&facet.field=se_sample_tissue_code&facet.field=se_sample_tissue_class&facet.field=se_nuc_acid_type&facet.field=ssam_sample_georegion&start=0&rows=10

0 投票
3 回答
5404 浏览

wcf - 是否有可能有“重载”的 uritemplates?

这可能吗 - 如果没有,有人可以提出替代方案吗?

0 投票
3 回答
561 浏览

.net - 使用 webHttpBinding 从服务中获取 Gibberish 而不是 Hello World

这是一个应该返回“Hello World”字符串的简单示例。但是,浏览器会显示类似SGVsbG8gV29ybGQ=. 从 oldskul 风格的服务返回纯文本的正确方法是什么?

请知道:

  1. 我无法返回字符串:三个 Unicode 字符将被自动添加到前面,旧的 HTTP 客户端将无法互操作。

  2. 我可以返回 a Message,但仍然必须保持解析功能来提取data变量。AFAIK 不允许在同一方法签名中 混合Message和键入。int

    p>

更新:这不是乱码,而是正确编码的响应。但是,格式不是我期望收到的。我已经发现(正如下面的先生所建议的那样)传输层消息格式的最终​​控制是通过Message类获得的。但是,如果我确实使用了一个 - 我失去了解析请求(UriTemplate属性)的可能性。因此,很高兴知道如何MessageUriRequest.

PS如果“干净”集成是不可能的 - 那么最优雅的解决方法是什么?请问是否有任何代码可以在我的实现中借用和使用的线幕后面完成?