Ruby 3 net-http:如何编码查询参数以匹配 Open Page Rank 示例中的参数?

问题描述

我正在尝试使用 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','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)
}

尝试 ruby​​ 时,我得到一个 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?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)