我正在尝试使用net/http
向 Open Page Rank 发送请求。
api docs以这个 PHP 为例:
$url = 'https://openpagerank.com/api/v1.0/getPageRank';
$query = http_build_query(array(
'domains' => array(
'google.com',
'apple.com',
'unknowndomain.com'
)
));
$url = $url .'?'. $query;
$ch = curl_init();
$headers = ['API-OPR: YOUR-API-KEY-HERE'];
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$output = curl_exec ($ch);
curl_close ($ch);
$output = json_decode($output,true);
我在 Ruby 中的尝试如下所示:
require 'net/http'
uri = URI('https://openpagerank.com/api/v1.0/getPageRank')
params = { domains: ['google.com', 'apple.com', 'unknowndomain.com'] }
uri.query = URI.encode_www_form_component(params)
req = Net::HTTP::Get.new(uri)
req['API-OPR'] = api_key
res = Net::HTTP.start(uri.hostname, uri.port, :use_ssl => true) { |http|
http.request(req)
}
尝试红宝石时,我得到一个400
. 正文告诉我没有提供域。
=> "{\"status_code\":400,\"response\":\"No Domains were provided\",\"last_updated\":\"13th Feb 2021\"}"
查看 Ruby 和 PHP 中的请求 uri,我可以看到查询字符串不同。
使用URI.encode_www_form(params)
:
"https://openpagerank.com/api/v1.0/getPageRank?domains=google.com&domains=apple.com&domains=unknowndomain.com"
使用http_build_query()
:
https://openpagerank.com/api/v1.0/getPageRank?domains%5B0%5D=google.com&domains%5B1%5D=apple.com&domains%5B2%5D=unknowndomain.com'
我也试过了URI.encode_www_form_compoent(params)
。生成的 URL 再次不同:
"https://openpagerank.com/api/v1.0/getPageRank?%7B%3Adomains%3D%3E%5B%22google.com%22%2C+%22apple.com%22%2C+%22unknowndomain.com%22%5D%7D"
我仍然得到同样的回应。
我假设服务器期望查询字符串具有特定的编码。如何以 Open Page Rank 接受的方式发送带有查询参数的请求/生成 URL?