使用JSON正文内容参数调用HTTP GET

Don*_*ald 5 c#

如何在内容正文中使用JSON参数调用HTTP GET?

我尝试了这个:

HttpWebRequest.WebRequest.Create(_uri);
httpWebRequest.ContentType = "application/json";
httpWebRequest.Method = "GET";
httpWebRequest.Headers.Add("X-AUTH-TOKEN", _apiKey);

using(var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream())) {
  string _json = "\"{\"filter\": {\"relation\": \"equals\", \"attribute\": \"state\", \"value\": \"CA\"  },  \"insights\": {\"field\": \"family.behaviors\",  \"calculations\": [\"fill_count\"]}}";

  streamWriter.Write(_json);
  streamWriter.Flush();
  streamWriter.Close();
}

var httpResponse = (HttpWebResponse) httpWebRequest.GetResponse();
using(var streamReader = new StreamReader(httpResponse.GetResponseStream())) {
  var result = streamReader.ReadToEnd();
}
Run Code Online (Sandbox Code Playgroud)

但它抛出一个异常:

“无法发送带有这种动词类型的内容主体。”

alf*_*oks 6

如果您使用 .NET 核心,新的HttpClient可以处理这个问题。否则你可以使用System.Net.Http.WinHttpHandler包,但它有很多依赖项。查看答案

/sf/answers/3353164391/

关于如何使用这两个。

我不能使用 .NET 核心,我不想安装System.Net.Http.WinHttpHandler. 我通过使用反射解决了这个问题,以欺骗WebRequest使用 GET 请求发送正文是合法的(根据最新的 RFC)。我所做的是将ContentBodyNotAllowedHTTP 动词“GET”设置为 false。

var request = WebRequest.Create(requestUri);

request.ContentType = "application/json";
request.Method = "GET";

var type = request.GetType();
var currentMethod = type.GetProperty("CurrentMethod", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(request);

var methodType = currentMethod.GetType();
methodType.GetField("ContentBodyNotAllowed", BindingFlags.NonPublic | BindingFlags.Instance).SetValue(currentMethod, false);

using (var streamWriter = new StreamWriter(request.GetRequestStream()))
{
    streamWriter.Write("<Json string here>");
}

var response = (HttpWebResponse)request.GetResponse();
Run Code Online (Sandbox Code Playgroud)

但是请注意,该属性ContentBodyNotAllowed属于静态字段,因此当其值更改时,它对程序的其余部分仍然有效。就我的目的而言,这不是问题。


kun*_*nif 0

GET 只会接收它。

如果需要指定参数,请将其包含在url中。
或者,如果 POST 或 PUT,您可以发送 JSON BODY。

HTTP请求方式

HTTP 定义了一组请求方法来指示对给定资源执行的所需操作。尽管它们也可以是名词,但这些请求方法有时被称为 HTTP 动词。它们中的每一个都实现不同的语义,但是它们中的一组共享一些共同的功能:例如,请求方法可以是安全的、幂等的或可缓存的。

  • GET
    GET 方法请求指定资源的表示形式。使用 GET 的请求应该只检索数据。
  • HEAD
    HEAD 方法要求的响应与 GET 请求的响应相同,但没有响应正文。
  • POST
    POST 方法用于将实体提交到指定资源,通常会导致状态更改或对服务器产生副作用。
  • PUT
    PUT 方法用请求负载替换目标资源的所有当前表示。

此外:

我找到了这个。进行了长时间的讨论。
带请求正文的 HTTP GET

这意味着可以使用 GET 发送 BODY,但是在 GET 请求上发送有效负载正文可能会导致某些现有实现拒绝该请求(例如路由中间的代理)。

请务必仔细阅读本文,因为还有很多其他要点需要注意。


顺便说一句,似乎您可以使用 cURL 命令的 -i 选项发送带有正文的 GET。

带 json 参数的 Curl GET 请求