Rails 및 HTTParty를 사용하여 API에 JSON 게시


106

내 Ruby on Rails 앱의 사용자가 내 외부 티켓 관리 시스템 인 squishlist.com에 티켓을 제출할 수 있기를 바랍니다. 다음과 같은 API와 지침이 있습니다. 인증하고 토큰을 얻은 다음 토큰과 함께 티켓을 제출해야합니다. 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}

테스트 목적으로 테스트 용 컨트롤러, 경로 및보기 (페이지)를 만들었습니다. 내 컨트롤러에는 다음이 있습니다.

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

그런 다음 컨트롤러 작업의 결과를 확인하기 위해 이동하는 페이지가 있으며 다음 코드가 있습니다.

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

나는 그 과정에서 내가받은 응답 때문에 일반적으로 작동하고 있음을 알고 있습니다. 내 json은 squishlist에서 정의한 필드 때문에 예제와 다릅니다. 누구든지이 문제에 대해 나를 도울 수 있습니까?

진짜 문제는 json이 어떻게 생겼는지, 심지어 일치하는지조차 알 수 없다는 것입니다. 저는 json에 대해 잘 모릅니다. 쉽게 할 수있는 것을 사용해야할까요? 이것을 제출하기 위해 ajax를 사용해야합니까? 어떤 도움이라도 대단히 감사합니다. 나는 여기 커뮤니티를 사랑합니다.

답변:


257

.to_json제목 정보를 추가하여이 문제를 해결했습니다.

@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
또한 "GitLab API"와 같은 일부 API는 "Accept"헤더를 감지합니다. 따라서 헤더는 :headers => { 'Content-Type' => 'application/json', 'Accept' => 'application/json'}. 참고 : 헤더는 JSON으로 변환되지 않아야하며 해시
Devaroop 2013-09-28

레일에서 API를 디버그하는 데 정말 유용한 Rails 엔진 (젬으로 포장 됨)을 배포했습니다. 엔진을 마운트하고 지정한 URL (예 : "localhost : 3000 / api_explorer")로 이동하면됩니다. 또한 파일에서 웹 서비스 사양을 읽는 API를 문서화하는 방법입니다. gem의 이름은 'api_explorer'이고 저장소는 github.com/toptierlabs/api_explorer 입니다. API 개선에 대한 의견이나 도움을 환영합니다. :)
Tony

6
문서에없는 것은 어리석은 일입니다.
Tyler Collier 2014 년

감사! 이것은 훌륭하게 작동했습니다! 하지만 질문 : JSON 배열을 어떻게 포함 시키겠습니까?
Ruben Martinez Jr.

1
위의 형식과 같이 90k 레코드와 같은 수집 데이터를 푸시하고 싶습니다. 단일 API 호출로 전체 데이터를 푸시 할 수 있습니까? 귀하의 의견을 알려주십시오
Raju akula 2015-04-15

13

:query_string_normalizer옵션도 사용할 수 있으며 기본 노멀 라이저를 재정의합니다.HashConversions.to_params(query)

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

대박! 이렇게하면 해시를 저장할 수 request.options[:body]있지만 올바른 문자열을 보낼 수 있습니다. 이것이 질문에 대한 진정한 답이되어야합니다.
freemanoid

이 옵션은 query_string_normalizer 클래스 메소드를 사용하여 HTTParty를 포함하는 클래스에서 기본값으로 설정할 수도 있습니다. 참조 : ruby-doc.org/gems/docs/h/httparty2-0.7.10/HTTParty/…
Fryie

콘텐츠 유형 헤더를 설정해야 할 수도 있습니다 : ruby-doc.org/gems/docs/h/httparty2-0.7.10/HTTParty/…
Fryie 2014-09-24

1
query_string_normalizer게시 데이터가 아닌 쿼리 문자열에 사용해야합니다.
josephrider

링크 ruby-doc.org가 죽었습니다. 문서는 httparty doc
yacc
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.