【问题标题】:Translating this curl line to Rails Post Request and returning JSON response将此卷曲线转换为 Rails 发布请求并返回 JSON 响应
【发布时间】:2014-05-12 20:34:16
【问题描述】:

我已经发布了一些与此相关的问题,但我仍然对实现有点迷茫。

基本上我需要从 Venmo API 翻译这一行以进行支付:

curl https://api.venmo.com/v1/payments -d access_token=4e4sw1111111111t8an8dektggtcbb45 -d email="someemail@gmail.com" -d amount=5 -d note="Delivery."

以 POST 请求表单/格式进入我的 Rails 站点。

我的表单中现在有以下内容:

<!-- Venmo box -->
                    <div class="box box-warning">
                        <div class="box-header">
                            <%= form_tag ('/make_payment_path') do %>
                            <%= hidden_field_tag "access_token", @access_token %>
                          <h3 class="box-title">Pay Bill using Venmo Account</h3>
                            <div id="payment_note_input">
                            <%= text_field_tag "payment_note", nil, class:"form-control", placeholder: "add a note to your payment" %>
                            </div>
                            <div id="payment_target_input">
                                <%= text_field_tag "payment_target", nil, class:"form-control", placeholder: "pay an email address" %>
                            </div>
                            <div id="payment_amount_input">
                                <%= text_field_tag "payment_amount", nil, class:"form-control", placeholder: "enter the payment amount!"%>
                            </div>
                                </br>
                        <%= submit_tag "Make payment", class: "btn btn-danger" %>
                        <% end %>
                    </div>

在我的仪表板控制器中与视图对应的以下内容:

def make_payment_path
if !params[:access_token].nil?

    uri = URI.parse("https://api.venmo.com/v1/payments")
    http = Net::HTTP.new(uri.host, uri.port)
    request = Net::HTTP::Post.new(uri.request_uri)
    request.set_form_data({"access_token" => params[:access_token], "email" => params[:payment_target],
     "amount" => params[:payment_amount], "note" => params[:payment_note]} )

    response = http.request(request)
end
end

谁能帮我指出正确的方向吗?一旦通过 Venmo 处理了这个 POST 请求,它应该返回一个 JSON 响应,如 here 所示。

【问题讨论】:

    标签: ruby-on-rails json post request response


    【解决方案1】:

    您没有指定错误消息是什么。 :-)

    我运行了你的代码,response.body 显示“400 普通 HTTP 请求已发送到 HTTPS 端口”

    看来您需要强制使用 SSL:

    http.use_ssl = true
    http.verify_mode = OpenSSL::SSL::VERIFY_PEER 
    

    示例:

    http = Net::HTTP.new(uri.host, uri.port)
    http.use_ssl = true
    http.verify_mode = OpenSSL::SSL::VERIFY_PEER
    request = Net::HTTP::Post.new(uri.request_uri)
    

    新代码得到一个 json 响应:

    {"error": {"message": "You did not pass a valid OAuth access token.", "code": 261}}
    

    假设添加正确的访问令牌将解决问题。

    附带说明一下,您可能还想将控制器代码移到模型中

    【讨论】:

    • 我对这部分代码感到困惑:&lt;%= form_tag ('/make_payment_path') do %&gt; 因为当我测试它时,它需要 make_payment_path 的路由。这个表单是否应该创建一个路由?
    • 是的,你需要一条路线。 routes.rb 只是一个流量控制器,它将您引导到正确的控制器。在这种没有路由的情况下,Rails 不知道将 /make_payment_path 发送到仪表板控制器的 make_payment_path 操作。假设您的控制器被称为仪表板,这条路线应该这样做:发布'make_payment_path' => 'dashboard#make_payment_path' 更多信息:guides.rubyonrails.org/routing.html
    • 好的,我添加了您上面提到的正确路由,现在通过将redirect_to :action =&gt; :confirm_payment 添加到仪表板控制器中 make_payment_path 操作的底部来使其正常工作。现在如何从 Venmo API 呈现 JSON 响应?
    • render json: response.body 是我在这里寻找的。我想我已经得到了剩下的。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    • 1970-01-01
    • 2017-04-07
    • 2017-04-13
    • 2016-04-04
    相关资源
    最近更新 更多