再谈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或者其他的类来发送请求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值