为什么' +'被转换为'%2B'以及如何防止这种情况?

时间:2014-07-23 13:14:19

标签: ruby uri urldecode httparty

我正在发出GET请求以搜索某些商家信息。关键字我测试的是iphone 5

做的时候:

m = Marktplaats.new
m.search(keyword: 'iphone 5')

我得到无关紧要的数据。

以下是我使用的代码:

require 'httparty'

class Marktplaats
  include HTTParty

  base_uri('https://api.marktplaats.nl')

  def search(keyword)

    # Debug
    puts search_query_params(keyword)
    puts last_uri(self.class.get('/api3/ads.json', query: search_query_params(keyword)))

    self.class.get('/api3/ads.json', query: search_query_params(keyword))
  end

  def view(urn)
    self.class.get("/api3/ads/#{urn}.json", query: default_query_params)
  end

  def categories
    self.class.get('/api3/categories.json', query: default_query_params)
  end

  protected

    def default_query_params
      {
        oauth_token: '1me6jq76h8t6rim747m7bketkd',
        api_ver: '3.7',
        session: 'ebc565b8-659f-40f6-9d0a-96986f1d1595',
        screenWidth: '62',
        screenHeight: '111',
        app_ver: 'Android3.1.0'
      }
    end

    def search_query_params(args = {})
      search_params = {
        q: split_keyword(args[:keyword]),
        searchOnTitleAndDescription: args[:search_on_title_and_description] || 'false',
        showListings: args[:show_listings] || 'true',
        categoryId: args[:category_id] || '1953',
        page: args[:page] || '1',
        size: args[:size] || '30',
        sortBy: args[:sort_by] || 'DEFAULT',
        sortOrder: args[:sort_order] || 'DESCENDING',
        showHistograms: args[:show_histograms] || 'true'
      }
      merge_params(default_query_params, search_params)
    end

    def merge_params(params1, params2)
      params1.merge(params2)
    end

    def split_keyword(keyword)
      keyword.gsub(' ', '+')
    end

    def last_uri(last_request)
      last_request.request.last_uri
    end
end

puts search_query_params(keyword)返回:

{:oauth_token=>"1me6jq76h8t6rim747m7bketkd", :api_ver=>"3.7", :session=>"ebc565b8-659f-40f6-9d0a-96986f1d1595", :screenWidth=>"62", :screenHeight=>"111", :app_ver=>"Android3.1.0", :q=>"iphone+5", :searchOnTitleAndDescription=>"true", :showListings=>"false", :categoryId=>"1953", :page=>"1", :size=>"30", :sortBy=>"DEFAULT", :sortOrder=>"DESCENDING", :showHistograms=>"true"}

last_uri(self.class.get('/api3/ads.json', query: search_query_params(keyword)))返回:

https://api.marktplaats.nl/api3/ads.json?oauth_token=1me6jq76h8t6rim747m7bketkd&api_ver=3.7&session=ebc565b8-659f-40f6-9d0a-96986f1d1595&screenWidth=62&screenHeight=111&app_ver=Android3.1.0&q=iphone%2B5&searchOnTitleAndDescription=false&showListings=true&categoryId=1953&page=1&size=30&sortBy=DEFAULT&sortOrder=DESCENDING&showHistograms=true

我认为它与请求URI有关。关键字之间的+符号显示为%2B。因此iphone+5显示为iphone%2B5。如果我在URI中将iphone%2B5替换为iphone+5,则会返回正确的数据。

问题是如何在使用HTTParty发出GET请求时阻止+符号转换为%2B

注意: 这可能是the Tin Man在评论here时所谈论的内容。

1 个答案:

答案 0 :(得分:0)

我通过从类中删除#split_keyword(keyword)方法来修复此问题,因此不再使用它了。

我似乎不需要用' '符号手动替换单词之间的+。如果我这样做,他们就会转换为%2B,而这似乎无法发挥作用。

如果没有手动更换,' '会转换为%20,这确实有效。

相关问题