在 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操作系统的管理工具->服务中添加一项服务呢?