Stream requestStream = null;
HttpWebRequest httpRequest = null;
try
{
WebRequest webRequest = WebRequest.Create(url);
httpRequest = webRequest as HttpWebRequest;
if (httpRequest == null)
{
httpRequest.Abort();
throw new ApplicationException(string.Format("无效的URL地址: {0}", url));
}
httpRequest.ContentType = "application/json"; //编码方式
httpRequest.Method = "POST"; //提交方式
httpRequest.ContentLength = data.Length;
httpRequest.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
httpRequest.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.2; zh-CN; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8";
httpRequest.Headers.Add("Authorization", "Basic " + contentType);
httpRequest.CookieContainer = new CookieContainer();
//httpRequest.ContentType = "application/json";
requestStream = httpRequest.GetRequestStream();
await requestStream.WriteAsync(data, 0, data.Length);
}
catch (Exception exx)
{
throw new Exception(string.Format("POST异常:{0}", exx.Message));
}
finally
{
if (requestStream != null) requestStream.Dispose();
}
Stream responseStream = null;
HttpWebResponse res;
byte[] b = null;
MemoryStream ms = null;
try
{
res = (HttpWebResponse)await httpRequest.GetResponseAsync();
responseStream = res.GetResponseStream();
ms = new MemoryStream();
int count = 0;
byte[] buff = new byte[1024];
do
{
count = await responseStream.ReadAsync(buff, 0, buff.Length);
ms.Write(buff, 0, count);
} while (count > 0);
b = ms.ToArray();
}
catch (WebException exp)
{
throw new Exception(string.Format("POST操作发生异常:{0}", exp.Message));
}
finally
{
if (ms != null) ms.Dispose();
if (responseStream != null) responseStream.Dispose();
}
return b;
在Postman上可以访问,抓包查看header是没有一些参数,例如application/json抓包的时候header里就没有
403是權限問題
先確認你的授權資訊是否正確
谢谢您的回答,我想问一下像这里的授权资讯是什么
url以及权限验证我都是正确的
在Postman上可以访问,抓包查看header是没有一些参数,例如application/json抓包的时候就看不到
@陈俐安:
使用這個API應該需要Token或Key之類的
這些資訊是否有正確帶給API?
@RosonJ: 我想问的就是这里,API需要base64给参数带过去,我contentType这个就是base64的参数,然后我抓包看header里面是没有这个参数的
@陈俐安:
是整個header不存在?還是值空了
@RosonJ: 是header里该有的鉴权的键值对没有,但是我debug看又是有的,抓包看header就没有;
像ContentType:application/json这个键值对也是没有
@陈俐安:
加這個試試
httpRequest.PreAuthenticate = true;
@RosonJ: 不行啊,还是403。。
@陈俐安:
用你的代碼實測有送出Authorization header
你用什麼工具抓包?
@RosonJ: charles 啊,那我怎么一直都是403呢。。。
@陈俐安:
Wireshark抓包結果如圖
是否是你的Authorization 值不對呢?
@RosonJ: 值可能是不对的,但是我用同样的值postman可以收到返回参数,但这里就一直返回403
@陈俐安:
能否提供data, url及假的Authorization,我試試
@RosonJ: postman返回的参数是:{
"ret_code": 1008003,
"err_msg": "auth failure"
},能返回这个就成功了
@陈俐安:
搞清楚了,其實兩種請求方式的結果是一樣的
Postman 收到403 後還是會顯示json結果
httpRequest.GetResponse 接收到403 就跳到錯誤處理,其實也有接到json 結果,只是沒處理而已
用wireshark抓包的結果一模一樣
@RosonJ: 嗷嗷,好的谢谢解答,非常感谢。
@RosonJ: 那我需要如何处理才能收到这个json呢
@飞腾的翔:
這樣
catch(WebException ex)
{
var response = (HttpWebResponse)ex.Response;
}
@RosonJ: 好的非常感谢!
建议检查一下下面这行代码是否有问题
httpRequest.Headers.Add("Authorization", "Basic " + contentType);
谢谢您的回复,我抓包看了header,是没有这个键值对的,所以不知道该怎么在header里添加键值对
因为这个API鉴权需要在header里添加键值对,所以这个参数这样添加,但是我抓包的时候看到是没有这个键值对的
@陈俐安: 代码有些乱,建议简化一下,比如 ASP.NET/C# WebRequest POST Google OAuth API
Postman 可以查看调用的很多语言系的代码,可以和你的进行对比,看一下有什么不同,就知道问题