C#REST客户端使用POST发送数据
我正试图向RESTWeb服务发送一个简单的POST请求并打印响应(代码如下,主要取自Yahoo!developer文档和一些文档提供的MSDN代码片段)。我希望客户发送: 请求方法:POST(即,我希望$\u服务器['Request\u Method']==PHP中的'POST')C#REST客户端使用POST发送数据,c#,http,rest,C#,Http,Rest,我正试图向RESTWeb服务发送一个简单的POST请求并打印响应(代码如下,主要取自Yahoo!developer文档和一些文档提供的MSDN代码片段)。我希望客户发送: 请求方法:POST(即,我希望$\u服务器['Request\u Method']==PHP中的'POST') 数据:foo=bar(即$\u POST['foo']=='bar'在PHP中) 然而,它似乎在发送: 请求方法:FOO=BARPOST 数据:(空白) 我知道API是可以工作的,因为我已经用Python和PHP编写
数据:foo=bar(即$\u POST['foo']=='bar'在PHP中) 然而,它似乎在发送: 请求方法: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#客户端时,服务器上的$#u POST数组是空的。最终找到了HttpWebRequest.PreAuthenticate属性,如果代码是这样编辑的,它似乎可以解决问题:
request = (HttpWebRequest) WebRequest.Create(uri);
request.PreAuthenticate = true;
request.Credentials = new NetworkCredential(user, password);
request.Method = WebRequestMethods.Http.Post;
从文档中,我假定这会在发送实际POST请求之前强制进行身份验证。我不确定该类为什么不会自动执行此操作(其他语言的库使此过程透明,除非您显式关闭它),但它为我解决了问题,并可能为其他人节省2天的搜索和头发拉扯时间
值得一提的是,不需要为GET请求设置PreAuthenticate,只需设置POST,尽管如果为GET请求设置PreAuthenticate,一切都会正常工作,但需要的时间稍长一些