最近要用到百度的api 
对一个https 的网站发个post请求
但是各种401网上能找的方法基本试了一遍
但是基本上还是没什么改变。包括周公的那篇 如何 对http/https 发送 post  改变ssl callback 一样无法解决。地址放在这里,请各位大神帮帮忙。能post 后获得文字信息就行。
浏览器可以轻松打开,但是用c# webclient httprequest 访问均为401 错误。https://openapi.baidu.com/oauth/2.0/token?
    grant_type=client_credentials&
    client_id=Va5yQRHlA4Fq4eR3LT0vuXV4&
    client_secret= 0rDSjzQ20XUj5itV7WRtznPQSzr5pVw2&得到的回文应该是酱紫  
    "access_token": "1.a6b7dbd428f731035f771b8d15063f61.86400.1292922000-2346678-124328",
    "expires_in": 86400,
    "session_key": "ANXxSNjwQDugf8615OnqeikRMu2bKaXCdlLxn",
    "session_secret": "248APxvxjCZ0VEC43EYrvxqaK4oZExMB",
只要能出东西就行啊流程走通。剩下都好说。httpspost

解决方案 »

  1.   


            public string CretRequest()
            {
                Uri uri = new Uri("https://localhost");
                HttpWebRequest request = HttpWebRequest.Create(uri) as HttpWebRequest;
                //验证服务器证书回调自动验证 ****关键****            
                ServicePointManager.ServerCertificateValidationCallback = CheckValidationResult;
                HttpWebResponse response = request.GetResponse() as HttpWebResponse;
                Stream stream = response.GetResponseStream();
                StreamReader streamReader = new StreamReader(stream);
                return streamReader.ReadToEnd();
            }        /// <summary>
            /// 请求响应时SSL证书验证
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="certificate"></param>
            /// <param name="chain"></param>
            /// <param name="errors"></param>
            /// <returns></returns>
            public bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
            { // 总是接受 
                return true;
            }
      

  2.   

    {"error":"invalid_client","error_description":"Client authentication failed"}看到这个就对了出字就行。  关键用程序访问是401
      

  3.   


    看一下百度API提供的授权是否有问题
      

  4.   

    你要访问的URL 是用百度帐户登录过才可以访问到吧. 如果这样的话,你还得模拟登录,取得百度给你的token,这样你的程序对这个URL才有访问权限. 
    你先用浏览器登录后,获取一个带token的URL后,让程序去直接访问是不行的.
      

  5.   

    我表示打开你给的url弹出下载框,然后就是“无法下载来自XXXXX”
      

  6.   

    看API是Get 还是Post, Get的话, 用你的浏览器直接打开链接, 如果同样返回 401,应该再仔细看看API的说明文档 ,
    从参数中有一个  client_id 猜测, 估计在调用这个API之前需要进行登陆授权,如果是那后续的操作均需要附带上Cookies, 以及Referer等
      

  7.   

    附一个我的 HttpHelper:namespace QQ
    {
        public class HttpHelper
        {
            private readonly string DefaultUserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)";        public HttpWebResponse HttpGetRequest(string url, string referer, int? timeout, CookieCollection cookies)
            {
                HttpWebRequest request = null;              if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
                {
                    ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
                    request = WebRequest.Create(url) as HttpWebRequest;
                    request.ProtocolVersion = HttpVersion.Version10;
                }
                else
                    request = WebRequest.Create(url) as HttpWebRequest;            request.Method = "GET";
                request.ContentType = "application/x-www-form-urlencoded";
                request.UserAgent = DefaultUserAgent;
                request.CookieContainer = new System.Net.CookieContainer();            if (!string.IsNullOrEmpty(referer))
                    request.Referer = referer;            if (timeout.HasValue)
                    request.Timeout = timeout.Value;
                else
                    request.Timeout = 25000;            if (cookies != null)
                {
                    request.CookieContainer = new CookieContainer();
                    request.CookieContainer.Add(cookies);
                }            return request.GetResponse() as HttpWebResponse;  
            }        public HttpWebResponse HttpPostRequest(string url, string referer, string postData, CookieCollection cookies, string contentType = null)
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                request.CookieContainer = new System.Net.CookieContainer();
                request.Timeout = 65000;                        UTF8Encoding encoding = new  System.Text.UTF8Encoding();
                byte[] data = encoding.GetBytes(postData);            request.Method = "POST";            if (!string.IsNullOrEmpty(contentType))
                    request.ContentType = contentType;
                else
                    request.ContentType = "application/x-www-form-urlencoded";            request.ContentLength = data.Length;
                request.KeepAlive = true;            if(!string.IsNullOrEmpty(referer))
                    request.Referer = referer;            if (cookies != null)
                    request.CookieContainer.Add(cookies);            using (Stream stream = request.GetRequestStream())
                {
                    stream.Write(data, 0, data.Length);
                }            return request.GetResponse() as HttpWebResponse;
            }        private  bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
            {
                return true;
            } 
        }
    }