关于一个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;
}
依旧这个问题 求解。。。。。。。
而且你这个方法我已经用过了 不管用。 --------------------编程问答--------------------
{"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#