通过curl或来自Ruby的HTTParty从具有许多保留字符的URL中检索

时间:2014-04-01 01:46:17

标签: ruby http url curl

我有一个Digital object identifier,里面有一堆URI保留字符:

  

10.1002 /(SICI)1096-9861(19960304)366:2'; 270 :: AID-CNE7> 3.0.CO; 2-2

我试图使用此DOI从DOI解析API中提取书目数据。 API的URL方案是http://dx.doi.org/DOIHERE。还可以包括一些标头以指定响应的格式。当我将网址http://dx.doi.org/10.1002/(SICI)1096-9861(19960304)366:2<270::AID-CNE7>3.0.CO;2-2直接粘贴到Chrome地址栏时,它可以正常工作,我会被重定向到适合该文章的页面。但是,我无法在命令行的curl或Ruby脚本中使用此URL或使用Ruby的HTTParty gem获得相同的响应。我尝试手动%编码所有特殊字符并遇到同样的问题:

url1 = "http://dx.doi.org/10.1002/(SICI)1096-9861(19960304)366:2<270::AID-CNE7>3.0.CO;2-2"
url2 = "http://dx.doi.org/10.1002%2F%28SICI%291096-9861%2819960304%29366%3A2%3C270%3A%3AAID-CNE7%3E3.0.CO%3B2-2"
headers = { "Accept" => 'application/x-bibtex;q=1.0' }

`curl -LH "Accept: application/x-bibtex;q=1.0" -i #{url1}`  # empty string response
`curl -LH "Accept: application/x-bibtex;q=1.0" -i #{url2}`  # 504 Gateway timeout error
HTTParty.get url1, headers: { "Accept" => 'application/x-bibtex;q=1.0' }  # Ruby throws InvalidURI error
HTTParty.get url2, headers: { "Accept" => 'application/x-bibtex;q=1.0' }  # blank response body

此外,在URI.escape上运行Ruby的url1只会转义尖括号,尽管它们的状态为保留字符,但仍保留括号,分号和冒号。有人可以解释这里发生了什么,以及我如何以编程方式从此URL中检索?

1 个答案:

答案 0 :(得分:1)

从您的请求中删除H "Accept: application/x-bibtex;q=1.0"。在浏览链接时从浏览器中,您没有指定此标头。因此,不需要从卷曲中指定。

下面一个与我完美配合:

curl -LH  -i -v "http://dx.doi.org/10.1002%2F%28SICI%291096-9861%2819960304%29366%3A2%3C270%3A%3AAID-CNE7%3E3.0.CO%3B2-2"