我正在尝试编写一个 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,而不是我期望的身份验证代码:
我不太确定会收到什么回复,但我知道 Pacer 的一封电子邮件中提到了“NextGenCSO cookie”。如果我通过 Web 浏览器登录并查看 cookie,我会看到 NextGenCSO cookie;我猜我应该在 API 调用的响应中看到类似的内容:
更新 - 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
您想要包含 loginid
和 passwd
作为数据(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/