【问题标题】:httpclient post method returns StatusCode: 403, ReasonPhrase: 'Forbidden'httpclient post 方法返回 StatusCode: 403, ReasonPhrase: 'Forbidden'
【发布时间】:2019-06-09 07:26:02
【问题描述】:

我正在尝试使用 c# httpclient 以编程方式从网站获取数据,但我无法获取数据。 我提供了下面的链接 https://ngodarpan.gov.in/index.php/home/statewise_ngo/5972/33/1

会有一个以表格格式显示的数据列表,如果您单击任何链接,将弹出一个包含完整详细信息集的弹出窗口,我需要以编程方式为每条记录获取它。

我尝试通过点击以下链接每次生成 csrf_token https://ngodarpan.gov.in/index.php/ajaxcontroller/get_csrf

并尝试将 csrf 令牌和 ID 传递给以下链接 https://ngodarpan.gov.in/index.php/ajaxcontroller/show_ngo_info

但这会引发错误 403 禁止。

private void sample1()
{
    string str = 
       "https://ngodarpan.gov.in/index.php/ajaxcontroller/show_ngo_info";
    var client = new HttpClient();

    var pairs = new List<KeyValuePair<string, string>>
    {
        new KeyValuePair<string, string>("id", "169486"),
        new KeyValuePair<string, string>("csrf_cookie_name", 
        "decab99c17a84a9040a03c362317289c")
    };

    var content = new FormUrlEncodedContent(pairs);

    var response = client.PostAsync(str, content).Result;
}

{StatusCode:403,ReasonPhrase:'Forbidden',版本:1.1,内容:System.Net.Http.StreamContent,标头: { 日期:2019 年 6 月 9 日星期日 07:01:09 GMT 设置 Cookie:csrf_cookie_name=2e39ed6c9bb142836d81233ba1a94732; expires=星期日,2019 年 6 月 9 日 07:01:11 GMT;最大年龄=2;路径=/; httponly 服务器:Apache/2.4.6 服务器:(红帽企业 Linux) 服务器:OpenSSL/1.0.1e-fips 服务器:mod_fcgid/2.3.9 服务器:PHP/5.6.30 服务器:mod_wsgi/3.4 服务器:Python/2.7.5 X-Powered-By: PHP/5.6.30 内容长度:1131 内容类型:文本/html;字符集=UTF-8 }}

【问题讨论】:

  • 您尝试访问的 api 必须受到授权和身份验证的保护,您需要拥有访问令牌,并且访问令牌应该具有获取信息所需的权限,因此基本上如果授权未通过则你得到 403,在你的请求中我也看不到你正在传递任何令牌。

标签: c# post httpclient form-data


【解决方案1】:

当你得到csrf_token 时,你应该将它的值设置为两个东西。 请求正文中的csrf_test_namecookies中的csrf_cookie_name。您可以在浏览器中查看网络选项卡详细信息以获取更多详细信息。


private async Task sample1()
{
    var url = "https://ngodarpan.gov.in";
    var uri = new Uri(url);
    string str = $"{url}/index.php/ajaxcontroller/show_ngo_info";
    var csrf_token = "80c719c60ac281c34f2f7720fbd28be9";
    HttpClientHandler handler = new HttpClientHandler();
    handler.CookieContainer = new CookieContainer();
    handler.CookieContainer.Add(uri, new Cookie("csrf_cookie_name",csrf_token)); // Adding a Cookie
    var client = new HttpClient(handler);

    client.DefaultRequestHeaders.Add("X-Requested-With", "XMLHttpRequest");

    var pairs = new List<KeyValuePair<string, string>>
    {
        new KeyValuePair<string, string>("id", "169486"),
        new KeyValuePair<string, string>("csrf_test_name", csrf_token)
    };

    var content = new FormUrlEncodedContent(pairs);

    var response = await client.PostAsync(str, content);
    using (FileStream fS = File.Create("result.json"))
    {
        await response.Content.CopyToAsync(fS);
    }
    Console.WriteLine(response);
}

【讨论】:

  • 嗨,我仍然没有得到我需要的数据。我不知道哪里出错了。实际上我想从弹出选项卡中提取数据。
  • 是的,这是一个疯狂的 api,它检查 X-Requested-With 标题字段的响应类型:D,我编辑了答案,效果很好。
  • 哦,非常感谢……你让我的工作变得简单……真的很棒……再次感谢。
猜你喜欢
  • 2012-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-23
  • 2019-05-26
  • 2023-01-31
  • 1970-01-01
相关资源
最近更新 更多