c# - 如何使用 RestSharp 将登录名和密码发布到 API?

标签 c# rest post cookies httprequest

我正在尝试编写一个 C# 应用程序来调用 Pacer.gov 的 api。我需要做的第一件事是获取一个 cookie 来传递我的请求。我正在使用 Chrome 的 Postman 应用程序来尝试生成 POST 请求。有人可以解释一下我做错了什么吗?

我从 Pacer.gov 获得的获取身份验证 token 的说明是

For credentials, you can POST username(loginid) and password(passwd) to the authentication service here https://pacer.login.uscourts.gov/cgi-bin/check-pacer-passwd.pl This will issue you a PacerSession cookie.

以下是我尝试过的一些方法: (我只是显示@@@@@作为登录名,*****作为密码,但我在尝试时使用了实际的登录名和密码)

  • 在 URL 中包含用户名和密码

    var client = new RestClient("https://pacer.login.uscourts.gov/cgi-in/check-pacer-passwd.pl?loginid=@@@@@&passwd=*****");
    var request = new RestRequest(Method.POST);
    request.AddHeader("postman-token", "a5bd0d9c-85f5-4ed6-6ad8-ac06e553f5db");
    request.AddHeader("cache-control", "no-cache");
    IRestResponse response = client.Execute(request);
    

    o 收到 HTML 页面,显示“访问 PACER 需要有效的帐户 ID 和密码。 “

  • 在 header 中包含用户名和密码

    var client = new RestClient("https://pacer.login.uscourts.gov/cgi-bin/check-pacer-passwd.pl");
    var request = new RestRequest(Method.POST);
    request.AddHeader("postman-token", "add9dedf-10bf-eab4-428a-134c0e8a1783");
    request.AddHeader("cache-control", "no-cache");
    request.AddHeader("passwd", "*****");
    request.AddHeader("loginid", "@@@@@");
    IRestResponse response = client.Execute(request);
    

    o 收到 HTML 页面,显示“访问 PACER 需要有效的帐户 ID 和密码。 “

  • 在正文中包含用户名和密码作为表单数据

    var client = new RestClient("https://pacer.login.uscourts.gov/cgi-bin/check-pacer-passwd.pl");
    var request = new RestRequest(Method.POST);
    request.AddHeader("postman-token", "454a8ebd-b2b4-3db2-0c5c-c48e2964c671");
    request.AddHeader("cache-control", "no-cache");
    request.AddHeader("content-type", "multipart/form-data; boundary=---011000010111000001101001");
    request.AddParameter("multipart/form-data; boundary=---011000010111000001101001", "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"loginid\"\r\n\r\n@@@@@\r\n-----011000010111000001101001\r\nContent-Disposition: form-data;          name=\"passwd\"\r\n\r\n*****\r\n-----011000010111000001101001--", ParameterType.RequestBody);
    IRestResponse response = client.Execute(request);
    

    o 收到消息“无法得到任何回复”

  • 使用用户名和密码在 Chrome 中输入网址

    https://pacer.login.uscourts.gov/cgi-bin/check-pacer-passwd.pl?loginid=@@@@@&passwd=*****
    

    o 收到错误“无法访问此网站”

更新 - 2016 年 5 月 31 日

我又进行了几次尝试,但仍然没有取回 cookie。我尝试了这段代码:

        var client = new RestClient("https://pacer.login.uscourts.gov");

        var request = new RestRequest("/cgi-bin/check-pacer-passwd.pl", Method.POST);
        request.AddParameter("loginid", "@@@@@");
        request.AddParameter("passwd", "*****");

        IRestResponse response = client.Execute(request);

当我查看响应时,有一个名为 JESSIONID 的 cookie,它似乎只是一个通用浏览器 session ID,而不是我期望的身份验证代码:

enter image description here

我不太确定会收到什么回复,但我知道 Pacer 的一封电子邮件中提到了“NextGenCSO cookie”。如果我通过 Web 浏览器登录并查看 cookie,我会看到 NextGenCSO cookie;我猜我应该在 API 调用的响应中看到类似的内容:

enter image description here

更新 - 2016 年 6 月 3 日

感谢 @jonathon-reinhart 的帮助,我能够使用此代码获取身份验证 cookie:

// Authentication
        var client = new RestClient("https://pacer.login.uscourts.gov");

        client.CookieContainer = new System.Net.CookieContainer();
        var request = new RestRequest("/cgi-bin/check-pacer-passwd.pl", Method.POST);
        request.AddParameter("loginid", "@@@@@");
        request.AddParameter("passwd", "*****");

        IRestResponse response = client.Execute(request);

        var PacerSession = "";

        foreach (RestResponseCookie cookie in response.Cookies)
        {
            if (cookie.Name == "PacerSession")
            {
                PacerSession = cookie.Value;
            }
        }

最佳答案

您没有按照说明正确发布。

把这个:

https://pacer.login.uscourts.gov/cgi-bin/check-pacer-passwd.pl?loginid=@@@@@&passwd=*****

进入地址栏不是POST。这是带有查询字符串参数的 GET。

请参阅RestSharp homepage有关如何 POST 的示例:

var request = new RestRequest("resource/{id}", Method.POST);
request.AddParameter("name", "value"); // adds to POST or URL querystring based on Method

您想要包含 loginidpasswd 作为数据(RestSharp 称之为“参数”),有 header 。

所以你应该这样做:

var client = new RestClient("https://pacer.login.uscourts.gov");

var request = new RestRequest("/cgi-bin/check-pacer-passwd.pl", Method.POST);
request.AddParameter("loginid", "@@@@");
request.AddParameter("passwd", "****");

IRestResponse response = client.Execute(request);

关于c# - 如何使用 RestSharp 将登录名和密码发布到 API?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37491868/

相关文章:

java - 如何查找带注释的函数参数的类型

java - 休息网络服务 : How to accept a list of parameter

ruby-on-rails - Rails 表单 - 如果未选中任何复选框,则参数不包含在 POST 中

c# - ASP.NET MVC 发布不适用于弹出窗口

c# - Spss .NET 库

c# - 关闭连接/MySqlDataReader 不起作用

javascript - `www.me.com/page.php` 和 `www.me.com/page.php?1` 和 `www.me.com/page.php?2` 被视为 3 个唯一的 URI 吗?

javascript - 使用 JQuery 从模态( Bootstrap )传递输入数组

c# - 如何在保持持久性无知的同时创建丰富的领域对象?

c# - 转到另一页时,在单击按钮时播放声音C#