zoukankan      html  css  js  c++  java
  • 再谈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或者其他的类来发送请求。

  • 相关阅读:
    Laravel 404错误,Laravel根目录可以访问,非根目录就会出现404 页面找不到的错误
    laravel 终端自动创建控制器
    在 Windows 中安装 Laravel 5.1.X
    CentOS 6.5 Apache搭建虚拟主机
    Host '192.168.1.21' is not allowed to connect to this MySQL server
    用数组实现栈(C++)
    C++入门级小算法
    一些简单小算法
    C++中的大数乘的实现
    指针数组和数组指针
  • 原文地址:https://www.cnblogs.com/qidian10/p/2105016.html
Copyright © 2011-2022 走看看