最近要用到百度的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
对一个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
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;
}
看一下百度API提供的授权是否有问题
你先用浏览器登录后,获取一个带token的URL后,让程序去直接访问是不行的.
从参数中有一个 client_id 猜测, 估计在调用这个API之前需要进行登陆授权,如果是那后续的操作均需要附带上Cookies, 以及Referer等
{
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;
}
}
}