ruby - 需要进行 HTTP 调用以发送电子邮件并获得响应

标签 ruby xml parsing rest sinatra

我正在编写一个将使用 SendGrid 发送电子邮件的 Sinatra 应用程序。他们提供了一个用于发送电子邮件的 REST API,我想找出调用该 API 并获得响应的最佳方式。

调用的格式是:

https://sendgrid.com/api/mail.send.xml?api_user=youremail@domain.com&api_key=secureSecret&to=destination@example.com&toname=Destination&subject=Example%20Subject&text=testingtextbody&from=info@domain.com

响应采用 XML 格式,我需要对其进行解析以检查成功/失败。更多信息,请访问 http://sendgrid.com/documentation/ApiWebMail

完成调用和解析返回的最佳方法是什么?

最佳答案

Ruby 内置的 Net::HTTP 库功能强大,但我喜欢 HTTPClient因为它有一套不错的 simplified commands .内置 open-uri如果您不需要做太多繁重的工作,也非常方便。

对于解析HTML和XML,真是无敌Nokogiri .

Ruby 内置了一个名为 URI 的 URL 解析器,但我喜欢 Addressable更好,尤其是当我要经常弄乱查询参数时。

以下是使用各种 gem 的一些示例:

require 'addressable/uri'
require 'nokogiri'
require 'open-uri'

如果您想轻松地操作查询参数,那么 Addressable::URI 会很方便:

url = 'https://sendgrid.com/api/mail.send.xml?api_user=youremail@domain.com&api_key=secureSecret&to=destination@example.com&toname=Destination&subject=Example%20Subject&text=testingtextbody&from=info@domain.com'
uri = Addressable::URI.parse(url)
uri.query_values # => {"api_user"=>"youremail@domain.com", "api_key"=>"secureSecret", "to"=>"destination@example.com", "toname"=>"Destination", "subject"=>"Example Subject", "text"=>"testingtextbody", "from"=>"info@domain.com"}

您可以将该散列分配给一个变量,修改值,然后使用 uri.query_values= 重新分配它们。

如果您想要一个比 HTTPClient 更简单的接口(interface),Ruby 的 Open-URI 会非常简单。这将向 url 发送请求,将结果返回给 Nokogiri 以解析为 XML:

doc = Nokogiri::XML(open(uri.to_s))

根据您链接到的站点,返回的 XML 响应“看起来像这样”:

returned_xml = '<result>
  <message>success</message>
</result>'

所以,如果我们解析它:

doc = Nokogiri::XML(returned_xml)

我们可以很容易地得到响应:

doc.at('message').inner_text # => "success"

我无法展示完整的往返示例,因为我在那里没有帐户,但这应该能让你开始。

关于ruby - 需要进行 HTTP 调用以发送电子邮件并获得响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4929907/

相关文章:

ruby-on-rails - 在 Rails 4 中将 hstore 列与 simple_form 集成

ruby-on-rails - Rails 按列分组并选择列

xml - 在魔兽世界中使用界面选项插件的代码问题

java - 解析包含嵌套标签的 xml

parsing - ANTLR : issue with greedy rule

ruby - 错误信息 : -bash:/etc/profile. d/rvm.sh: 没有那个文件或目录

ruby - 如何在 Ruby 中获取 13 位整数的当前时间?

javascript - 当我使用元素数组时,Jquery element.text() 错误 "is not a function"

javascript - jQuery 解析带有段落错误的原始 HTML

Python 从 csv 中去掉每一个双引号