再談HTTP Post XML資料

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.