问题标签 [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.
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 编码的字符。看来这将在那里大部分工作。
在我的一项服务中,作为参数的特殊字符在语义上是查询/过滤器的一部分(实际上是搜索服务的搜索词),但在另一项服务中,它们并不是查询/过滤器的一部分,因此理想情况下它们是路径而不是查询字符串。
我的问题是,什么选择是最好的?以下是我知道的一些:
使用 HTTP GET 和查询字符串。 任何可能使用特殊字符的内容都应该在查询字符串上并进行 Url 编码。 这是我倾向于的地方,但我担心查询字符串过长(IE 有 2083 个限制)
在路径中使用 HTTP GET 和 base64 编码。 对于可能使用特殊字符的任何参数,请使用修改后的 Base64 作为 URL,并在首选时将它们保留为路径的一部分。 我试过这个并且它有效,但它有点难看。仍然担心极长的查询字符串。
使用 HTTP POST 和消息正文。 任何可能使用特殊字符的内容都应该在请求的正文中。 似乎是一个不错的解决方案,但是帖子被理解为不是幂等的,并且(我认为)通常是为了更改(而这里没有发生更改)。
使用 HTTP GET 和消息正文。 任何可能使用特殊字符的内容都应该在请求的正文中。根据SO:HTTP GET with request body和Roy Fielding这似乎是个坏主意。
根据请求的大小,使用 #3 和上面的 #1 或 #2 的组合。
其他???
请注意,在某些情况下,我可能能够改变一些东西以防止特殊字符(我可能会这样做),但我无法在所有情况下都这样做。
关于 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 个字符。
wcf - WCF 休息帮助页面
如何将 WCF REST 服务 UriTemplate 更新为 www.mysite.com/... 而不是系统名称http://mysystem/ ...
当我转到服务帮助页面时,我看到了系统名称,我不希望最终用户看到它。
我想看看
我想这是我可以在 web.config 中更新的东西吗?
.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 但这不是一个选项,因为目录的数量是可变的。
wcf - UriTemplateTable 不区分动词
我试图用WCF REST Contrib在 .NET 3.5 中设计一个 REST 服务。我的服务几乎可以正常工作,但我面临一个奇怪的错误。
基本上,我有两种方法:
和
但是我在激活时收到错误消息:
System.InvalidOperationException 未被用户代码处理 Message="UriTemplateTable 不支持具有与模板'/books?id={identity}' 等效路径但具有不同查询字符串的多个模板,其中查询字符串不能全部通过文字值消除歧义.有关更多详细信息,请参阅 UriTemplateTable 的文档。” 来源="系统.ServiceModel.Web"
如果我重命名第二种方法,/books2?identity
那么它可以正常工作。
知道为什么UriTemplateTable
不区分动词吗?
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。
c# - 长而复杂的 URI
我有一个网络服务可以访问网络上的某些资源。该服务有一个方法来查找资源并返回资源的路径。另一种方法,使用此路径发送请求到 Web 服务。
我尝试将整个 UNC 路径(用HttpServerUtlility.UrlTokenEncode
方法编码)传递给 web 服务。生成的 URI 很长(331 个字符),我得到“HTTP 400 Bad Request”。
如何处理这么长的 URI?如果我的 URI 短了大约 10 个字符,那么请求就会通过。不幸的是,URI 的大小是可变的,在某些情况下可能更大。我需要做哪些改变?配置文件中是否有任何设置允许长 URI?
wcf - 无法将“%26”传递给 WCF 服务中的 WebGet UriTemplate 变量?
我有一个具有此声明操作的 WCF 服务:
但是,当尝试调用 URL 时Test/You%26Me
,IIS 返回错误:
我的目标是通过 URL-Encoding: %26 在 URI 中使用 & 符号
通配符没有帮助。有没有办法在不禁用安全功能的情况下防止这个错误?
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
wcf - 是否有可能有“重载”的 uritemplates?
这可能吗 - 如果没有,有人可以提出替代方案吗?
.net - 使用 webHttpBinding 从服务中获取 Gibberish 而不是 Hello World
这是一个应该返回“Hello World”字符串的简单示例。但是,浏览器会显示类似SGVsbG8gV29ybGQ=
. 从 oldskul 风格的服务返回纯文本的正确方法是什么?
请知道:
我无法返回字符串:三个 Unicode 字符将被自动添加到前面,旧的 HTTP 客户端将无法互操作。
我可以返回 a
p>Message
,但仍然必须保持解析功能来提取data
变量。AFAIK 不允许在同一方法签名中 混合Message
和键入。int
更新:这不是乱码,而是正确编码的响应。但是,格式不是我期望收到的。我已经发现(正如下面的先生所建议的那样)传输层消息格式的最终控制是通过Message
类获得的。但是,如果我确实使用了一个 - 我失去了解析请求(UriTemplate
属性)的可能性。因此,很高兴知道如何Message
与UriRequest
.
PS如果“干净”集成是不可能的 - 那么最优雅的解决方法是什么?请问是否有任何代码可以在我的实现中借用和使用的线幕后面完成?