之前寫過一篇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或者其他的類來發送請求。