【问题标题】:.NET HTTP GET with Body.NET HTTP GET 与正文
【发布时间】: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


【解决方案1】:

您只能使用 HTTP GET 发送查询字符串(curl 命令也是如此,您可以使用 fiddler 等工具对其进行检查)。您将必须传递整个字符串,如下所示:

string json = JsonConvert.SerializeObject(query);
string url = "https://someplace.com/api?pretty="+json;
var wr = WebRequest.Create(url);
wr.Method = "GET";

注意:curl -XGET 和 curl -G 是一样的。

【讨论】:

  • 是的,我知道是这种情况,我正在寻求替代方案。
  • 别无选择,你为什么要降低答案?
猜你喜欢
  • 2016-05-13
  • 2017-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多