我正在尝试向名为Pacer.gov的API发出请求。我希望返回一个文件,但没有收到。有人可以帮我解决我所缺少的吗?
所以我的C#Rest调用看起来像这样:
(变量PacerSession是我获得的身份验证cookie(在@ jonathon-reinhart的帮助下);有关此内容的更多信息,请参见:How do I use RestSharp to POST a login and password to an API?)
var client = new RestClient("https://pcl.uscourts.gov/dquery");
client.CookieContainer = new System.Net.CookieContainer();
//var request = new RestRequest("/dquery", Method.POST);
var request = new RestRequest(Method.POST);
request.AddParameter("download", "1");
request.AddParameter("dl_fmt", "xml");
request.AddParameter("party", "Moncrief");
request.AddHeader("user-agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36");
request.AddHeader("content-type", "text/plain; charset=utf-8");
request.AddHeader("accept", "*/*");
request.AddHeader("accept-encoding", "gzip, deflate, sdch");
request.AddHeader("accept-language", "en-US,en;q=0.8");
request.AddHeader("cookie", "PacerSession=" + PacerSession);
IRestResponse response = client.Execute(request);
如果仅在Chrome中键入URL https://pcl.uscourts.gov/dquery?download=1&dl_fmt=xml&party=Moncrief,则将返回一个XML文件。当我查看IRestResponse时,看不到任何看起来像文件的东西。我的请求有问题吗?还是我找回了文件,只需要知道如何检索它?
如果我直接在浏览器中使用URL,这是文件的一部分:
这是我调试VS并查看IRestResponse变量时在VS中看到的内容:
更新-6/3/16
收到了来自Pacer技术支持的回复:
在Advanced REST Client中,您将看到HTTP 302响应(重定向到另一个页面)。在普通浏览器中,将自动执行重定向,而用户不会看到任何内容(即使在浏览器中的URL上)。
ARC不会自动跟随该重定向到目标页面。
您可以在响应的标题中看到包含结果的目标URL。
如果您手动将此URL作为HTTP GET请求剪切并粘贴到ARC,则将获得XML结果。我从未使用过C#,但是通常有一个与Web客户端关联的属性,它将强制客户端遵循重定向。
我尝试添加以下内容:
client.FollowRedirects = true;
但是在调试此代码时,我仍然看不到xml文件:
IRestResponse response = client.Execute(request);
我如何获得文件?我需要做些什么才能从要重定向到的URL中获取文件?
最佳答案
您的代码存在一个主要问题。您只携带checp-pacer-passwd.pl
返回的三个cookie之一。您需要保留所有三个。下面的代码是对此的一种可能的实现,后面有一些注释。
public class PacerClient
{
private CookieContainer m_Cookies = new CookieContainer();
public string Username { get; set; }
public string Password { get; set; }
public PacerClient(string username, string password)
{
this.Username = username;
this.Password = password;
}
public void Connect()
{
var client = new RestClient("https://pacer.login.uscourts.gov");
client.CookieContainer = this.m_Cookies;
RestRequest request = new RestRequest("/cgi-bin/check-pacer-passwd.pl", Method.POST);
request.AddParameter("loginid", this.Username);
request.AddParameter("passwd", this.Password);
IRestResponse response = client.Execute(request);
if (response.Cookies.Count < 1)
{
throw new WebException("No cookies returned.");
}
}
public XmlDocument SearchParty(string partyName)
{
string requestUri = $"/dquery?download=1&dl_fmt=xml&party={partyName}";
var client = new RestClient("https://pcl.uscourts.gov");
client.CookieContainer = this.m_Cookies;
var request = new RestRequest(requestUri);
IRestResponse response = client.Execute(request);
if (!String.IsNullOrEmpty(response.Content))
{
XmlDocument result = new XmlDocument();
result.LoadXml(response.Content);
return result;
}
else return null;
}
}
在使用Pacer的整个过程中,最简单的方法就是保持
CookieContainer
。我将功能包装到一个类中,只是为了使其更容易打包此答案,但是您可以根据需要实现它。我没有进行任何真正的错误检查,因此您可能想检查response.ResponseUri
实际上是搜索页面而不是登录页面,并且内容实际上是格式正确的XML。我已经使用自己的Pacer帐户对此进行了测试,如下所示:
PacerClient client = new PacerClient(Username, Password);
client.Connect();
var document = client.SearchParty("Moncrief");