0

通常,如果我使用 HTTPClient 并发出 GetAsync(URI) 或类似命令,如果我想传递一些参数,如“int id、字符串名称、字符串除法”,我需要将它们附加到 uri:"http://localhost/webapplication/api/controller/action/id"

他们是否可以替代这种传递参数的标准方法,从而使 uri 中的信息不正确?

HTTPClient.MessageParameters = myOBject这样的东西放在消息正文中,然后我可以在另一边解包?

如果没有其他选择,使用 POST 隐藏参数是一种可接受的方式吗?

谢谢

4

3 回答 3

3

使用 POST 是隐藏这些参数的公认方式,如果执行请求有副作用,则绝对应该在 POST 请求中提交。GET 请求可能会被代理或其他地方缓存,这可能会给您带来问题。我认为您理论上可以尝试更改请求标头,但不能保证如果它们是非标准的,服务器不会丢弃它们,因此您不应该考虑该选项。

编辑:有关 X-headers(非标准 HTTP 标头)以及您是否可以安全使用它们的更多信息,请参阅此问题。看来它们现在已被弃用。

于 2013-08-01T18:16:47.767 回答
2

您至少有 2 个选项:

  • 添加包含您的数据的自定义 http 标头。

例如。

X-Var-Count: 3
X-Var-Name-1: id
X-Var-Value-1: <value_of_id>
X-Var-Name-2: name
X-Var-Value-2: <value_of_name>
X-Var-Name-3: division
X-Var-Value-3: <value_of_division>

显然这需要额外的服务器端处理。

  • 切换到 POST 请求
于 2013-08-01T18:16:29.380 回答
2

我会去一个POST。

使用 GET 传递的任何参数都可以由代理捕获和记录,或者将缓存在服务器日志中。

HttpWebRequest httpWReq =
(HttpWebRequest)WebRequest.Create("http://domain.com/page.aspx");

ASCIIEncoding encoding = new ASCIIEncoding();
string postData = "username=user";
postData += "&password=pass";
byte[] data = encoding.GetBytes(postData);

httpWReq.Method = "POST";
httpWReq.ContentType = "application/x-www-form-urlencoded";
httpWReq.ContentLength = data.Length;

using (Stream stream = httpWReq.GetRequestStream())
{
    stream.Write(data,0,data.Length);
}

HttpWebResponse response = (HttpWebResponse)httpWReq.GetResponse();

string responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();

查看代码:HTTP REQUEST WITH POST

参见推理:HTTP GET AND POST PARAMETERS RECOMMENDATIONS

于 2013-08-01T18:19:52.753 回答