如何从Pacer.gov API提出案例请求?

时间:2016-06-03 18:13:19

标签: c# rest post httpresponse restsharp

我正在尝试向名为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中输入网址https://pcl.uscourts.gov/dquery?download=1&dl_fmt=xml&party=Moncrief,我会收到一个XML文件。当我查看IRestResponse时,我看不到任何看起来像文件的内容。我的请求有问题,或者我收回文件,只需要知道如何检索它?

如果我直接在浏览器中使用URL,那么这是我回来的文件的一部分:

enter image description here

这是我在VS中看到的,当我调试它并查看IRestResponse变量时:

enter image description here

更新 - 2016年6月3日

收到Pacer技术支持部门的回复:

  

在高级REST客户端中,您将看到HTTP 302响应(重定向到另一个页面)。在普通浏览器中,自动跟踪重定向,用户看不到任何内容(即使在浏览器中的URL上)。   ARC不会自动跟随重定向到目标页面。   您可以在响应的标题中看到包含结果的目标URL   如果您手动将此URL作为HTTP GET请求剪切并粘贴到ARC,您将获得XML结果。我从未使用过C#,但通常会有一个与Web客户端关联的属性会强制客户端遵循重定向。

我尝试添加这个:

client.FollowRedirects = true;

但是在调试此代码时我仍然没有看到xml文件:

IRestResponse response = client.Execute(request);

enter image description here

我如何获取文件?我是否需要做一些事情才能从重定向到的URL中获取文件?

1 个答案:

答案 0 :(得分:0)

您的代码存在一个主要问题。您只携带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");