我正在尝试获取一个PDF文件,该文件在auth墙后面按需生成。根据我的测试,流程如下:
我使用多个参数(包括身份验证凭据)向相应页面发出GET
请求。该页面验证我的凭据,然后处理我的请求。当请求完成处理(几乎立即)时,我会收到一个302
响应,将我重定向到生成的PDF的位置。然后,该PDF只能由该会话访问。
使用浏览器,真的没什么奇怪的。我尝试通过curl
和wget
执行相同操作,但没有任何可选参数,但这些参数都失败了。我可以通过添加curl
作为选项来获得-L -b /tmp/cookie.txt
工作(但要遵循重定向和存储Cookie)。
According to the ruby-doc,使用Net::HTTP.start
应该让我接近我想要的。在玩完之后,我确实非常接近。我认为唯一的问题是,我的Set-Cookie
值在请求之间有所不同,即使它们在同一个http
块中使用相同的start
对象。
我尽量保持尽可能简单,然后在得到我想要的结果后扩展:
url = URI.parse("http://dev.example.com:8888/path/to/page.jsp?option1=test1&option2=test2&username=user1&password=password1")
Net::HTTP.start(url.host, url.port) do |http|
# Request the first URL
first_req = Net::HTTP::Get.new url
first_res = http.request first_req
# Grab the 302 redirect location (it will always be relative like "../servlet/sendfile/result/543675843657843965743895642865273847328.pdf")
redirect_loc = URI.parse(first_res['Location']
# Request the PDF
second_req = Net::HTTP::Get.new redirect_loc
second_res = http.request first_req
end
我还试图使用http.get而不是每次都创建一个新请求,但仍然没有运气。
答案 0 :(得分:1)
问题在于cookie:它应该在第二个请求中传递。 Smth喜欢:
second_req = Net::HTTP::Get.new(uri.path, {'Cookie' => first_req['Set-Cookie']})