我正在尝试向名为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,那么这是我回来的文件的一部分:
这是我在VS中看到的,当我调试它并查看IRestResponse变量时:
更新 - 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);
我如何获取文件?我是否需要做一些事情才能从重定向到的URL中获取文件?
答案 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");