2016-11-26 77 views
2

我需要发送带有内容正文的HTTP GET请求。是的,我知道这是皱眉,但它在技术上是一个合法的交易。.NET 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" } 
    } 
}' 
+0

你可能想阅读[这个答案](http://stackoverflow.com/a/983458/22099)它显示它不是“合法交易”。另一方面,如果你坚持,你可以低级别并建立连接并发送字节。 – miha

+0

@miha我没有看到它说它需要*不*发送身体。我同意,它应该没有意义,但ElasticSearch API使用它来定义复杂的查询,这些查询将被序列化为很长的URL。 重点是它并不是说它不能只是它应该没有意义。 – fungus1487

+0

这不是必需的,但它不是[推荐](https://tools.ietf.org/html/rfc2616#section-4.3)使用。原因是您的请求可能有多个层(代理,负载平衡器)之间。 GET请求可以被缓存,正文将被忽略。如果您不控制整个堆栈,您可能会在生产中遇到错误。 –

回答

-1

您可以使用HTTP GET只发送查询字符串(curl命令做同样的,你可以像小提琴手一些工具检查它)。你将不得不通过整个字符串象下面这样:

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

注:卷曲-XGET &卷曲-G相同。

+1

是的,我知道这是事实,我正在寻求替代方案。 – fungus1487

+0

有没有其他的选择,你为什么会降低答案? –