2016-06-03 14 views
2

Ich versuche, eine Anfrage an eine API namens Pacer.gov zu stellen. Ich erwarte, dass eine Datei zurückgegeben wird, aber ich verstehe es nicht. Kann mir jemand mit dem helfen, was mir fehlt?Wie erstelle ich eine Fallanfrage von der Pacer.gov API?

So sieht mein C# Ruhe Aufruf wie folgt:

(Die Variable PacerSession ist das Authentifizierungscookie I (mit Hilfe von @ jonathon-Reinhart bekam), lesen Sie mehr darüber hier: 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); 

Wenn ich einfach die URL https://pcl.uscourts.gov/dquery?download=1&dl_fmt=xml&party=Moncrief in Chrome eingeben, bekomme ich eine XML-Datei zurück. Wenn ich mir die IRestResponse anschaue, sehe ich nichts, was wie eine Datei aussieht. Ist etwas nicht in Ordnung mit meiner Anfrage oder bekomme ich die Datei zurück und muss nur wissen, wie man sie zurückholt?

Hier ist ein Teil der Datei, die ich zurück, wenn ich die URL direkt in den Browser zu verwenden:

enter image description here

Hier ist, was ich in VS zu sehen, wenn ich es debuggen und Blick auf die IRestResponse Variable:

enter image description here

UPDATE - 6/3/16

erhielt diese Antwort von Pacer tech Unterstützung:

Im erweiterten REST-Client wird eine HTTP 302-Antwort angezeigt (eine Weiterleitung an eine andere Seite). In einem normalen Browser wird die Weiterleitung automatisch verfolgt, ohne dass der Benutzer etwas sieht (selbst auf der URL im Browser). Der ARC folgt dieser Umleitung nicht automatisch auf die Zielseite. Sie können in der Kopfzeile der Antwort die Ziel-URL sehen, die die Ergebnisse enthält.
Wenn Sie diese URL manuell als HTTP GET-Anforderung ausschneiden und in die ARC einfügen, erhalten Sie die XML-Ergebnisse. Ich habe nie C# verwendet, aber es gibt normalerweise eine Eigenschaft, die mit Web-Clients verbunden ist, die den Client zwingen, der Umleitung zu folgen.

Ich habe versucht, das Hinzufügen dieses:

client.FollowRedirects = true; 

aber ich sehe noch keine XML-Datei, wenn ich diesen Code debuggen:

IRestResponse response = client.Execute(request); 

enter image description here

Wie bekomme ich die Datei? Muss ich etwas tun, um die Datei von der URL zu erhalten, an die sie weitergeleitet wird?

+1

Von Ihrem Debugger Screenshot ist der Inhaltstyp _not_ xml. Es ist eine Webseite. Insbesondere die Pacer-Anmeldeseite. Noch genauer gesagt, die Pacer-Login-Seite mit einer Umleitung auf die Suchseite. (Schauen Sie sich die 'ContentType'-Eigenschaft und die' ResponseUri'-Eigenschaft an) – theB

+0

Danke, dass Sie @theB beantwortet haben. Von dem, was ich vom technischen Support von Pacer bekommen habe, klingt es so, als ob die Anfrage umgeleitet wird. Ich habe versucht, die Option FollowRedirects einzuschalten, aber ich sehe immer noch nicht die XML-Datei. Wie bekomme ich die Datei von dieser umgeleiteten Seite? Ich habe meine ursprüngliche Frage mit den Informationen von Pacer aktualisiert. – boilers222

Antwort

0

Es gibt ein großes Problem mit Ihrem Code. Sie tragen nur einen der drei Cookies, die checp-pacer-passwd.pl zurückgibt. Sie müssen alle drei erhalten. Der folgende Code ist eine mögliche Implementierung davon mit einigen Hinweisen danach.

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

Es ist am einfachsten zu halten, nur einen Halt der CookieContainer während der gesamten Zeit mit Pacer Sie arbeiten.Ich habe die Funktionalität in eine Klasse eingepackt, nur um es ein wenig einfacher zu machen, diese Antwort zu verpacken, aber Sie können es implementieren, wie Sie wollen. Ich habe keine echte Fehlerüberprüfung durchgeführt, also möchten Sie wahrscheinlich überprüfen, dass response.ResponseUri tatsächlich die Suchseite und nicht die Anmeldeseite ist und dass der Inhalt tatsächlich wohlgeformtes XML ist.

ich getestet habe dies mein eigenes Pacer-Konto, etwa so:

PacerClient client = new PacerClient(Username, Password); 
client.Connect(); 
var document = client.SearchParty("Moncrief");