代码之家  ›  专栏  ›  技术社区  ›  DonKoko

使用ActiveResource::Base向API发送get请求

  •  0
  • DonKoko  · 技术社区  · 10 年前

    我对Rails很陌生,所以请耐心等待。

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

    有一个API,位于 postcodeapi.nu 该api的工作非常简单。为了让我收到地址,我需要发送 get 请求 http://api.postcodeapi.nu/5041EB 这会给我返回对应的地址 5041EB 邮政编码我将在将来使地址动态化,但让我们以这个链接为例。

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

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

    我在控制台上做了一些测试,但我不太确定该如何处理 Postcode.new 但返回空响应: => #<Postcode:0x00000006b5c178 @attributes={}, @prefix_options={}, @persisted=false>

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

    1 回复  |  直到 5 年前
        1
  •  0
  •   RPinel    10 年前

    由于API没有返回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是否适合这种情况。