使用 ActiveResource::Base 向 API 发送获取请求

Using ActiveResource::Base to send get requests to API

我是 Rails 的新手,所以请多多包涵。

我们正在为荷兰市场构建一个 Rails 4 应用程序。在注册过程中,要求用户填写邮政编码并自动生成地址是很常见的。这是可行的,因为在荷兰,每扇门都有一个独特的邮政编码,由 4 个数字和 2 个字母 (6828WQ) 组成。

位于 postcodeapi.nu. The api works pretty simple. In order for me to receive the address, I need to send a get request to http://api.postcodeapi.nu/5041EB 的 API 将 return 我的地址对应于 5041EB 邮政编码。以后我会把地址做成动态的,但是让我们以这个link为例。

一切都清楚了,但现在我不知道如何使用 ActiveResource 发送请求和缓存响应。这是我的模型的外观:

class Postcode < ActiveResource::Base
    self.site = "http://api.postcodeapi.nu/5041EB"
    headers['Api-Key'] = "495237e793d10330c1db0d57db9d3c7e6e485af7"
end

我从控制台做了一些测试,但我不太确定我应该如何处理它。我尝试使用简单的 Postcode.new 但 return 是一个空响应: => #<Postcode:0x00000006b5c178 @attributes={}, @prefix_options={}, @persisted=false>

我已经尝试了我所知道的一切,但没有成功。也许 ActiveResource 甚至不是我获取数据的正确方法?

由于 API 没有 return ActiveResources 期望的 JSON,您必须实施新的解析器。

class Postcode < ActiveResource::Base
  self.site = "http://api.postcodeapi.nu/"
  headers['Api-Key'] = "495237e793d10330c1db0d57db9d3c7e6e485af7"
  self.element_name = ''
  self.include_format_in_path = false

  class PostcodeParser < ActiveResource::Collection
    def initialize(elements = {})
      @elements = [elements['resource']]
    end
  end

  self._collection_parser = PostcodeParser
end

这应该适用于以下查询 Postcode.find('5041EB'),但不适用于 Postcode.where(id: '5041EB')。主要原因是 API 与 id 的参数键不同。 API 文档引用了 type,但没有用。

我不确定 ActiveResources 是否适合这种情况。