7

我使用的 API 要求我将方法设置为 GET 并包含消息正文。但是,当我尝试执行此操作时,出现以下错误:“无法发送具有此动词类型的内容主体”。我读到 HttpWebRequest 类不支持这一点,这是异常的原因。有解决办法吗?

这是我当前的代码:数据是一个 json 字符串,编码为字节数组

HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
request.Method = "GET";
request.ContentType = "application/json";
request.ContentLength = data.Length;
using (Stream requestStream = request.GetRequestStream()) {
    requestStream.Write(data.ToArray(), 0, (int)data.Length);
}

这是我试图模拟的 PHP 代码

<?php
$data = array("id" => "1234");
$data_string = json_encode($data);
$ch = curl_init('url');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-Type: application/json',
    'Content-Length: ' . strlen($data_string))
);
$result = curl_exec($ch);
var_dump($result);
?>

谢谢,

4

3 回答 3

2

什么叫做主动违背 REST 的 API?“急速”?“忧虑”?

幸运的是,他们的服务并不关心动词是什么,而 PHP 代码只是碰巧使用 GET 并遇到了服务器没有阻止它的错误,这是一个非常小的错误,只要它行为正确,使用 POST 就可以了。

如果做不到这一点,你最好的办法是看看他们是否有另一种方法(如果它是一个自然适合 GET 的读取请求)接受 URI 中的参数,可能根据 RFC 2616 使用适当的标头,或者可以通过发布、获取等。

如果这不起作用,则必须在 TcpClient 之上构建一个 HTTP 客户端。这将是非常可怕的。

于 2012-08-17T21:47:23.867 回答
2

完全有可能,但您必须使用较新的 HttpClient 类:https ://stackoverflow.com/a/47902348/70345

于 2017-12-20T08:57:53.660 回答
-3

不建议使用 GET 请求发送内容。有关详细信息,请参阅此帖子:HTTP GET with request body

就是罗伊菲尔丁要说的话题

于 2012-08-17T21:13:43.273 回答