ĐĂNG JSON lên API bằng Rails và HTTParty


106

Tôi muốn người dùng trong ứng dụng ruby ​​on rails của tôi có thể gửi vé đến hệ thống quản lý vé bên ngoài của tôi, squishlist.com. Họ có một api và hướng dẫn như sau. Bạn cần xác thực và lấy mã thông báo và sau đó gửi vé cùng với mã thông báo. Từ squishlist.

# get the token

https://api.squishlist.com/auth/?cfg=testcorp&user_key=privatekey&api_key=TEST-KEY-12345
  => {"token": "authtoken",
      "expires": "2010-06-16 13:31:56"}

# and then the ticket with the token

https://api.squishlist.com/rest/?cfg=testcorp&token=authtoken&method=squish.issue.submit&prj=demo
  POST data: {'issue_type': 1, 'subject': 'Hello, world.', 4: 'Open', 5: 10}

Với mục đích thử nghiệm, tôi đã tạo bộ điều khiển, tuyến đường và chế độ xem (trang) để thử nghiệm. Trên bộ điều khiển của tôi, tôi có những thứ sau

require 'httparty'
require 'json'

class SubmitticketController < ApplicationController

    def submit_a_ticket

        @cfg = 'xxxsupport'
        @user_key = '4787fsdbbfbfsdbhbfad5aba91129a3f1ed1b743321f7b'
        @api_key = 'MrUser411'
        @project = 'excelm-manoke'
        @url_new_string = 'https://api.squishlist.com/auth/?cfg='+@cfg+'&user_key='+@user_key+'&api_key='+@api_key
        # https://api.squishlist.com/auth/?cfg=xxxsupport&user_key=4787fsdbbfbfsdbhbfad5aba91129a3f1ed1b743321f7b&api_key=MrUser411  - this is what is created by @url_new_string
        response =  HTTParty.get(@url_new_string.to_str)  #submit the string to get the token
        @parsed_and_a_hash = JSON.parse(response)
        @token = @parsed_and_a_hash["token"]


        #make a new string with the token

        @urlstring_to_post = 'https://api.squishlist.com/rest/?cfg='+@cfg+'&token='+@token+'&method=squish.issue.submit&prj='+@project

        #submit and get a result

        @result = HTTParty.post(@urlstring_to_post.to_str, :body => {:subject => 'This is the screen name', :issue_type => 'Application Problem', :status => 'Open', :priority => 'Normal', :description => 'This is the description for the problem'})

    end

end

Và sau đó tôi có một trang mà tôi truy cập để xem kết quả của các hành động của bộ điều khiển và nó có mã sau.

<p><%= @result %></p>

Tôi biết rằng nó đang hoạt động nói chung vì những phản hồi mà tôi đã nhận được trong suốt quá trình. Json của tôi khác với ví dụ vì các trường tôi đã xác định trong danh sách bình phương. Bất cứ ai có thể giúp tôi về vấn đề này?

Tôi đoán vấn đề thực sự là tôi không thể thực sự nhìn thấy chiếc json trông như thế nào và liệu nó có gần trùng khớp hay không. Tôi thực sự không biết nhiều về json. Tôi có nên sử dụng thứ gì đó có thể dễ dàng không. Tôi có nên sử dụng ajax để gửi cái này không. Bất kỳ trợ giúp nào cũng được đánh giá rất cao. Tôi yêu cộng đồng ở đây.

Câu trả lời:


257

Tôi đã giải quyết điều này bằng cách thêm .to_jsonvà một số thông tin tiêu đề

@result = HTTParty.post(@urlstring_to_post.to_str, 
    :body => { :subject => 'This is the screen name', 
               :issue_type => 'Application Problem', 
               :status => 'Open', 
               :priority => 'Normal', 
               :description => 'This is the description for the problem'
             }.to_json,
    :headers => { 'Content-Type' => 'application/json' } )

9
ngoài ra, một số API như "API GitLab" phù hợp với tiêu đề "Chấp nhận". Vì vậy, tiêu đề nên được :headers => { 'Content-Type' => 'application/json', 'Accept' => 'application/json'}. Lưu ý: tiêu đề không nên được chuyển đổi sang JSON, nó được kỳ vọng sẽ trở thành một băm
Devaroop

Tôi đã triển khai một công cụ Rails (được đóng gói dưới dạng đá quý) thực sự hữu ích để gỡ lỗi các API trên đường ray. Bạn chỉ cần gắn công cụ và truy cập url mà bạn đã chỉ định, tức là “localhost: 3000 / api_explorer” để xem nó. Đó cũng là một cách ghi lại API, đọc thông số kỹ thuật của dịch vụ web từ một tệp. Đá quý được đặt tên là 'api_explorer' và repo là github.com/toptierlabs/api_explorer Mọi nhận xét hoặc trợ giúp cải thiện api đều được hoan nghênh. :)
Tony

6
Thật ngớ ngẩn khi nó không có trong tài liệu.
Tyler Collier

Cảm ơn! Điều này làm việc tuyệt vời! Tuy nhiên, câu hỏi: bạn sẽ bao gồm một mảng JSON như thế nào?
Ruben Martinez Jr.

1
Muốn đẩy dữ liệu thu thập 90k bản ghi như ở định dạng trên. Tôi có thể đẩy toàn bộ dữ liệu trong một lệnh gọi API không? vui lòng cho tôi biết ý kiến ​​của bạn
Raju akula

13

Các :query_string_normalizertùy chọn cũng có sẵn, mà sẽ ghi đè lên normalizer mặc địnhHashConversions.to_params(query)

query_string_normalizer: ->(query){query.to_json}

Tuyệt vời! Điều này cho phép lưu trữ hàm băm request.options[:body]nhưng gửi đúng chuỗi. Đây phải là câu trả lời thực sự cho câu hỏi.
freemanoid

Tùy chọn cũng có thể được đặt làm mặc định trong lớp bao gồm HTTParty với phương thức lớp query_string_normalizer, hãy xem: ruby-doc.org/gems/docs/h/httparty2-0.7.10/HTTParty/…
Fryie 24/09/14

Nó cũng có thể cần thiết để thiết lập các tiêu đề content-type: ruby-doc.org/gems/docs/h/httparty2-0.7.10/HTTParty/...
Fryie

1
query_string_normalizernên được sử dụng cho chuỗi truy vấn, không đăng dữ liệu.
josephrider

Các liên kết đến ruby-doc.orgchết, tài liệu là ở httparty doc
yacc
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.