我在C#中有一个WebRequest
我试图用来从Instagram检索数据。 WebRequest抛出The remote server returned an error: (403) Forbidden.
,但cURL命令返回HTML。实际上,我的POST表单数据会更长并返回JSON。
C#
String uri = "https://www.instagram.com/query/";
var request = (HttpWebRequest)WebRequest.Create(uri);
request.Method = "POST";
string postData = "q=ig_user(1118028333)";
ASCIIEncoding encoding = new ASCIIEncoding();
byte[] byte1 = encoding.GetBytes(postData);
// Set the content type of the data being posted.
request.ContentType = "application/x-www-form-urlencoded";
// Set the content length of the string being posted.
request.ContentLength = byte1.Length;
using (var dataStream = request.GetRequestStream())
{
dataStream.Write(byte1, 0, byte1.Length);
}
try
{
var x = (HttpWebResponse)request.GetResponse();
}
catch (WebException wex)
{
String wMessage = wex.Message;
}
引发错误403。
cURL(在Windows中)
curl "https://www.instagram.com/query/" --data "q=ig_user(1118028333)"
返回HTML。
FireFox请求正文,方法= POST,无标题
q=ig_user(1118028333)
返回HTML
为什么WebRequest会抛出错误403,而不是cURL或FireFox?我还可以在C#中做些什么来获取数据?
答案 0 :(得分:1)
为什么WebRequest会抛出错误403,而不是cURL或FireFox?
我觉得你很困惑。我之所以这么认为,是因为我只是尝试对Postman做同样的事情,当我得到一个HTML响应时,我也得到了403响应状态代码。我想你可能没有注意到cUrl的响应代码。见下文
我还可以在C#中做些什么来获取数据?
通常,我尝试使用System.Net.Http.HttpClient
类,因此我可以在抛出异常之前先检查状态代码,即使响应代码大于,也可以检索响应内容(如果有的话) 400(错误回复)
try
{
var client = new HttpClient();
var response = await client.GetAsync(url);
if (response.IsSuccessStatusCode)
{
var json = await response.Content.ReadAsStringAsync();
}
else
{
string content = null;
if (response.Content != null)
{
content = await response.Content.ReadAsStringAsync();
}
}
}
catch (Exception ex){}