再谈HTTP Post XML数据

之前写过一篇HTTPPost的文章http://www.cnblogs.com/qidian10/archive/2011/06/20/2085341.html

这篇文章的代码其实是有点问题的:第一次提交数据会不通过,然后再试的话都是没有问题的,一直不解,直到今天在MSDN上发现了解决方案,贴出代码如下:

protected string HttpPostData(string URL, string strParm, int outTime)
{
StringBuilder str
= new StringBuilder();
try
{
HttpWebRequest WRequest;
HttpWebResponse WResponse
= null;
HttpWebResponse response
= null;
//preAuth the request
// You can add logic so that you only pre-authenticate the very first request.
// You should not have to pre-authenticate each request.
Uri uri = new Uri(URL);
WRequest
= (HttpWebRequest)HttpWebRequest.Create(uri);
WRequest.Credentials
= new NetworkCredential("wcadmin", "wcadmin");
WRequest.PreAuthenticate
= true;
WRequest.UserAgent
= "Upload PLM XML";
WRequest.Method
= "HEAD";
WRequest.Timeout
= outTime;
WResponse
= (HttpWebResponse)WRequest.GetResponse();
WResponse.Close();
// Make the real request.
WRequest = (HttpWebRequest)HttpWebRequest.Create(URL);
WRequest.Credentials
= new NetworkCredential("wcadmin", "wcadmin");
WRequest.PreAuthenticate
= true;
WRequest.UserAgent
= "Upload PLM XML";
WRequest.Method
= "POST";
WRequest.AllowWriteStreamBuffering
= false;
WRequest.Timeout
= 10000;
Byte[] postBytes
= Encoding.UTF8.GetBytes(strParm);
WRequest.ContentLength
= postBytes.Length;
Stream requestStream
= WRequest.GetRequestStream();
requestStream.Write(postBytes,
0, postBytes.Length);
requestStream.Close();
try
{
response
= (HttpWebResponse)WRequest.GetResponse();
}
catch (WebException e)
{
response
= (HttpWebResponse)e.Response;
}
Stream responseStream
= response.GetResponseStream();
StreamReader streamReader
= new StreamReader(responseStream, Encoding.Default);
while (streamReader.Peek() != -1)
{
str.Append(streamReader.ReadLine());
}
streamReader.Close();
response.Close();
WResponse.Close();
}
catch (Exception error)
{
str.AppendLine(error.Message);
}
return str.ToString();
}

注意英文注释的那一段,通过这个方法即可成功提交数据,不会遇到莫名的400错误了。

如果上面还是遇到问题,请参考下面的代码

http://www.cnblogs.com/hyl8218/archive/2011/07/04/2097394.html

要在发送请求的时候添加HTTP Basic Authentication认证信息到请求中,有两种方法:

  • 一是在请求头中添加Authorization:
    Authorization: "Basic 用户名和密码的base64加密字符串"
  • 二是在url中添加用户名和密码:
    http://userName:password@api.minicloud.com.cn/statuses/friends_timeline.xml

下面来看下对于第一种在请求中添加Authorization头部的各种语言的实现代码。

先看.NET的吧:

string username="username";
string password="password";
//注意这里的格式哦,为 "username:password"
string usernamePassword = username + ":" + password;
CredentialCache mycache
= new CredentialCache();
mycache.Add(
new Uri(url), "Basic", new NetworkCredential(username, password));
myReq.Credentials
= mycache;
myReq.Headers.Add(
"Authorization", "Basic " + Convert.ToBase64String(new ASCIIEncoding().GetBytes(usernamePassword)));

WebResponse wr
= myReq.GetResponse();
Stream receiveStream
= wr.GetResponseStream();
StreamReader reader
= new StreamReader(receiveStream, Encoding.UTF8);
string content = reader.ReadToEnd();

  

你当然也可以使用HttpWebRequest或者其他的类来发送请求。

posted @ 2011-07-13 10:43  jackchain  阅读(916)  评论(0编辑  收藏  举报