当前位置:编程学习 > C#/ASP.NET >>

关于一个post 请求对应https 网站

最近要用到百度的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",


只要能出东西就行啊

流程走通。剩下都好说。 https post --------------------编程问答-------------------- 我用浏览器不能打开你给出的链接的 --------------------编程问答--------------------

        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;
        }

--------------------编程问答--------------------

依旧这个问题 求解。。。。。。。

而且你这个方法我已经用过了 不管用。 --------------------编程问答--------------------
引用 1 楼 lizhi3186575 的回复:
我用浏览器不能打开你给出的链接的

{"error":"invalid_client","error_description":"Client authentication failed"}

看到这个就对了

出字就行。  关键用程序访问是401 --------------------编程问答-------------------- 有没有大神能看一看啊 --------------------编程问答-------------------- 你使用 浏览器 返回的 状态码也是 401啊 ,亲。 --------------------编程问答--------------------
看一下百度API提供的授权是否有问题 --------------------编程问答-------------------- 你要访问的URL 是用百度帐户登录过才可以访问到吧. 如果这样的话,你还得模拟登录,取得百度给你的token,这样你的程序对这个URL才有访问权限. 
你先用浏览器登录后,获取一个带token的URL后,让程序去直接访问是不行的. --------------------编程问答-------------------- 我表示打开你给的url弹出下载框,然后就是“无法下载来自XXXXX” --------------------编程问答-------------------- 看API是Get 还是Post, Get的话, 用你的浏览器直接打开链接, 如果同样返回 401,应该再仔细看看API的说明文档 ,
从参数中有一个  client_id 猜测, 估计在调用这个API之前需要进行登陆授权,如果是那后续的操作均需要附带上Cookies, 以及Referer等 --------------------编程问答-------------------- 附一个我的 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;
        } 
    }
}

补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,