C# 如何使用RestSharp向API发布登录名和密码?

C# 如何使用RestSharp向API发布登录名和密码?,c#,rest,post,cookies,httprequest,C#,Rest,Post,Cookies,Httprequest,我正在尝试编写一个C#应用程序,它将调用Pacer.gov的api。我需要做的第一件事就是得到一个cookie来传递我的请求。我正在使用Chrome的Postman应用程序尝试生成一个POST请求。有人能解释一下我做错了什么吗 我从Pacer.gov获取身份验证令牌的说明如下 对于凭据,您可以在此处向身份验证服务发布用户名(loginid)和密码(passwd) 这将向您发送PacerSession cookie 以下是我尝试过的一些方法: (我只是将@@@显示为登录名,****显示为密码,但我

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

我从Pacer.gov获取身份验证令牌的说明如下

对于凭据,您可以在此处向身份验证服务发布用户名(loginid)和密码(passwd) 这将向您发送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和密码。”

  • 在标题中包括用户名和密码

    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中键入URL

    https://pacer.login.uscourts.gov/cgi-bin/check-pacer-passwd.pl?loginid=@@@@@&passwd=*****
    
    o收到错误“无法访问此站点”

更新-5-31-16

我已多次尝试,但仍无法取回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);
// 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;
            }
        }
当我查看响应时,有一个名为JESSIONID的cookie,它似乎只是一个通用浏览器会话ID,而不是我期望的身份验证代码:

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

更新-6-3-16

感谢@jonathon reinhart的帮助,我能够使用以下代码获得身份验证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);
// 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

有关如何发布的示例,请参见:

var request = new RestRequest("resource/{id}", Method.POST);
request.AddParameter("name", "value"); // adds to POST or URL querystring based on Method
您希望将
loginid
passwd
作为数据(RestSharp调用它们的参数)包含在内,而不是包含标题

所以你应该做这样的事情:

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);

感谢您的回复。这是我在Postman中尝试做的,但出于某种原因,它添加了参数作为查询字符串。我尝试了您的代码(当然使用正确的登录名/密码),收到了此响应:“在此服务器上找不到/check-pacer-passwd.pl中请求的URL/cgi。”有关于如何修复代码的建议吗?@boilers222您的原始代码有一个打字错误(
cgi in
,而不是
cgi bin
),我复制并粘贴了它。我已更正了答案中的代码。感谢您的帮助。您的代码运行时没有错误,但我没有收到预期的cookie作为响应。我用收到的响应更新了原始案例。我怀疑我将不得不从Pacer处获得某些内容,但他们一直没有响应。你能看看我得到了什么样的回复,以及我希望得到什么样的回复,并提供任何建议吗?再次感谢!谢谢你的帮助。我能够让这个工作正常进行。如果你想看的话,我更新了我的问题。现在我有了身份验证cookie,我正在进行实际的请求,并且遇到了问题。我我决定把它做成一个新的案子。你介意看一看,看看你的想法吗?饼干似乎在工作,但我没有得到我期望的返回文件。