C#WebRequest但不是cURL给出了错误403

时间:2017-02-22 05:38:37

标签: c# curl post httpwebrequest

我在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#中做些什么来获取数据?

1 个答案:

答案 0 :(得分:1)

  

为什么WebRequest会抛出错误403,而不是cURL或FireFox?

我觉得你很困惑。我之所以这么认为,是因为我只是尝试对Postman做同样的事情,当我得到一个HTML响应时,我也得到了403响应状态代码。我想你可能没有注意到cUrl的响应代码。见下文

enter image description here

  

我还可以在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){}