使用http post发送和接收XML

时间:2012-01-09 11:20:02

标签: ruby-on-rails ruby ruby-on-rails-3 api ruby-on-rails-3.1

我是rails的新手,并期待有人指出我如何完成以下任务的正确方向: -

  • 我需要通过直接传递XML文档与外部api进行通信 进入cgi(https://api.domain.com/v1/method.cgi)并将content-type设置为 “text / xml”,或将其作为参数传递并将content-type设置为“text / plain”

  • 我应该得到一个XML响应而不是HTML响应,所以没必要 下载HTML响应,存储它,然后为用户呈现本地副本;也不会 我需要将XML文档粘贴在本地生成的HTML表单的参数中 通过浏览器提交,以避免下载HTML。

  • 每个API方法都有示例xml代码(发送,响应,DTD,架构)

实现这一目标的最佳工具/技术是什么!??

其中一个更简单的方法如下: -

**SEND**

<?xml version="1.0" encoding="utf-8" ?>
<SoftwareAPI>
<Method>ListUsers</Method>
<APIKey>123</APIKey>
<Account>
    <UserName>admin</UserName>
    <Password>Password</Password>
</Account>
</SoftwareAPI>

**RESPONSE**

<?xml version="1.0" encoding="utf-8" ?>
<SoftwareAPIResponse>
    <TimeNow>2012-01-23T16:44:00Z</TimeNow>
    <ResponseId>01-23-1232729040-23456</ResponseId>
    <ListUsersResponse>
        <User>
            <Team>team</Team>
            <Office>office</Office>
            <UserName>Joe.Bloggs</UserName>
            <Password>Password123</Password>
            <FullName>Joe Bloggs</FullName>
            <Language>Auto-Detect</Language>
            <Telephone>+44 207 123 456 789</Telephone>
            <ResponseEmail>joebloggs@domain.co.uk</ResponseEmail>
        </User>
    </ListUsersResponse>
</SoftwareAPIResponse>
  • 如果编码完成,此API方法不需要用户或视图的交互 从控制器或我应该为所有api方法创建一个模型?
  • 如何使用上面指定的XML对cgi url执行发布并处理 响应XML并在视图中显示?
  • 完成此任务的最佳做法是什么?

非常感谢提前

强尼

1 个答案:

答案 0 :(得分:1)

您猜对了:您的API客户端的最佳位置是模型。使用HTTPartyRestClient等库,此任务相当简单。控制器只需要请求视图所需的数据。

这是使用HTTParty的一些示例代码。由于我没有细节,你必须稍微修改一下。这将是一个模型:

class JonnyService
  include HTTParty
  base_uri 'http://localhost:3000'
end

然后你可以像这样使用它。请注意,为了更加方便,将一些逻辑(例如,为每个服务方法创建post params)作为类方法移动到模型中可能会更好。

options = {
  :body => {
    :SoftwareAPI => {
      :Method => 'ListUsers',
      :APIKey => '123',
      :Account => {
        :UserName => 'admin',
        :Password => 'password'
      }
    }
  }
}

response = JonnyService.post('/service.xml', options)

puts response.inspect 

#response can be treated as a data structure:

puts response['ResponseId']