【发布时间】:2016-11-26 13:19:47
【问题描述】:
我需要发送带有内容正文的 HTTP GET 请求。是的,我知道这是不受欢迎的,但从技术上讲,这是一项合法交易。
目前 .NET WebRequest 类在尝试获取请求流时会失败,如下所示。
string url = "https://someplace.com/api";
var wr = WebRequest.Create(url);
wr.Method = "GET";
string json = JsonConvert.SerializeObject(query);
byte[] byteData = Encoding.UTF8.GetBytes(json);
using (var req = wr.GetRequestStream()) // Exception thrown here
{
req.Write(byteData, 0, byteData.Length);
req.Flush();
}
我还有什么其他选择?
等效的 CURL 命令是:
curl -XGET 'localhost:9200/twitter/tweet/_search?pretty' -d'
{
"query" : {
"term" : { "user" : "kimchy" }
}
}'
【问题讨论】:
-
您可能想阅读this answer,它表明它不是“合法交易”。另一方面,如果你坚持,你可以自己去低级建立连接并发送字节。
-
@miha 我看不出它在哪里说需要不发送正文。我同意它应该没有意义,但是 ElasticSearch API 使用它来定义复杂的查询,这些查询将被序列化为非常长的 URL。关键是它并没有说它不能只是它应该是没有意义的。
-
不是必需的,但不是recommended 可以使用。这样做的原因是您的请求之间可能有多个层(代理、负载均衡器)。可以在途中缓存 GET 请求,并且忽略正文。如果您不控制整个堆栈,您可能会在生产中遇到错误。
标签: c# .net elasticsearch webrequest