在 C# 的 RESTfull/HTTP 请求中添加标头和发布数据

Posted

技术标签:

【中文标题】在 C# 的 RESTfull/HTTP 请求中添加标头和发布数据【英文标题】:Adding Headers and Post data in RESTfull/HTTP Request in C# 【发布时间】:2011-10-18 15:51:28 【问题描述】:

我在用 C# 发送 POST 请求时遇到问题,我似乎误解了一些 HTTP 基础知识。所以基本上我正在实现 RESTfull 服务 client,其工作原理如下:

    使用用户名/密码发出 POST 请求并获取令牌 在发出其他 GET/POST/PUT 请求时在标头中使用此令牌 (Authorization:TOKEN)

我使用 WebRequest 发出 GET 请求(带有 Authorization 标头)并且它正在工作。但是当我使用以下代码发出 PUT 请求时,服务会返回“身份验证失败 - 未登录”消息:

String url = String.Format("0/1", AN_SERVER, app);
WebRequest theRequest = WebRequest.Create(url);
theRequest.Method = "POST";

theRequest.ContentType = "text/x-json";
theRequest.ContentLength = json.Length;
Stream requestStream = theRequest.GetRequestStream();

requestStream.Write(Encoding.ASCII.GetBytes(json), 0, json.Length);
requestStream.Close();


theRequest.Headers.Add("Authorization", authToken);

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

我在发送 POST 请求时一定犯了小错误(至少我希望如此)。那我做错了什么?

谢谢。

【问题讨论】:

您是否尝试过将 Headers.Add 移到 requestStream 之前?另一件看起来很奇怪的事情是没有传递给请求的命名参数,例如 requestStream.Write("json=" + json) @AI W:在 requestStream 解决问题之前移动标头。为什么顺序在这里很重要?非常感谢。我花了一天时间尝试“学习”这一点,30 分钟的 *** 更有帮助。您能否将其写为答案,以便我接受。再次感谢。顺便说一句,它是 json 对象被放入请求中,而不是命名参数。 服务器是否接受非授权服务的PUT请求? IIRC PUT(和 DELETE)在某些版本的 IIS 上默认不启用,因此其他服务器也可能是这种情况。 在@AI W 建议的更改之后,PUT 和 POST 都可以正常工作。所以基本上这个问题已经结束。谢谢 仅供参考 - System.Net.HttpRequestHeader 枚举具有标准的 HTTP 标头字段名称,因此您不必随意对字符串进行硬编码。 HttpRequestHeader.Authorization 可以用来代替“授权”。还有WebRequestMethods.Http.Post. 【参考方案1】:

在请求流工作之前移动标头(根据 AI W 的评论),因为请求流正在添加正文。

webrequest 内部实现的方式,需要在写body之前完成header,一旦它是流格式,就可以发送了。

如果你在反射器或一些类似的反编译工具中查看 webrequest 的实现,你将能够看到逻辑。

希望对你有帮助

【讨论】:

似乎是一个很糟糕的实现,我并不惊讶它会引起混乱。 它有点繁琐,但是一旦你习惯了它就相对简单地使用它。人们确实倾向于相对较快地遇到 webrequest 或 webclient 的限制,并开始使用 httpwebrequest 代替。

以上是关于在 C# 的 RESTfull/HTTP 请求中添加标头和发布数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在我的 iOS 应用程序中添加一项权利,以便在请求 Apple 之前快速测试它是不是有效

如何在Windows操作系统的管理工具->服务中添加一项服务呢?

如何在一个DataGridView中的一列添加DateTimePicker控件 C#

在 C# 中删除动态创建的控件

使C# WebApi返回Json

C#栈的简单介绍