C#REST客户端使用POST发送数据

时间:2010-10-04 14:12:50

标签: c# http rest

我正在尝试向REST Web服务发送一个简单的POST请求并打印响应(代码如下,主要来自Yahoo!开发人员文档和一些文档提供的MSDN代码片段)。我希望客户发送:

请求方法:POST(即我希望PHP中的$ _SERVER ['REQUEST_METHOD'] =='POST') 数据:foo = bar(即PHP中的$ _POST ['foo'] =='bar')

然而,它似乎在发送:

请求方法:FOO = BARPOST
数据:(空白)

我知道API工作正如我用Python和PHP编写的客户端测试的那样,所以我很确定它一定是我的C#的问题。我不是一个交易的.NET程序员,所以我会很感激任何关于如何找出问题的评论/指示 - 我确信这是微不足道的,但我自己也找不到它。

uri,用户和密码变量在代码中设置得更早 - 它们可以正常使用GET请求。

request = (HttpWebRequest) WebRequest.Create(uri);
request.Credentials = new NetworkCredential(user, password);
request.Method = WebRequestMethods.Http.Post;
request.ContentType = "application/x-www-form-urlencoded";

string postData = "foo=bar";
request.ContentLength = postData.Length;

StreamWriter postStream = new StreamWriter(request.GetRequestStream(), System.Text.Encoding.ASCII);
postStream.Write(postData);
postStream.Close();

response = (HttpWebResponse) request.GetResponse();

REST API是用PHP编写的,当使用C#客户端时,$ _POST数组在服务器上是空的。

1 个答案:

答案 0 :(得分:9)

最终找到HttpWebRequest.PreAuthenticate属性,如果代码编辑如此,似乎可以解决问题:

request = (HttpWebRequest) WebRequest.Create(uri);
request.PreAuthenticate = true;
request.Credentials = new NetworkCredential(user, password);
request.Method = WebRequestMethods.Http.Post;

从文档中我假设这会在发送实际POST请求之前强制进行身份验证。我不确定为什么这个类不会自动执行此操作(其他语言的库使这个过程透明,除非你明确地将其关闭),但它已经解决了我的问题,可能会为其他人保存另外2天的搜索和拔毛。

对于它的价值,PreAuthenticate不需要为GET请求设置,只需要POST,但是如果你为GET请求设置它,一切都会工作,但需要稍微长一些。