我正在尝试向名为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,这是文件的一部分:

c# - 如何从Pacer.gov API提出案例请求?-LMLPHP

这是我调试VS并查看IRestResponse变量时在VS中看到的内容:

c# - 如何从Pacer.gov API提出案例请求?-LMLPHP

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


c# - 如何从Pacer.gov API提出案例请求?-LMLPHP

我如何获得文件?我需要做些什么才能从要重定向到的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");

07-24 21:20