रेल और HTTParty का उपयोग करके एपीआई को पोस्ट JSON


106

मैं अपने बाहरी टिकट प्रबंधन प्रणाली, स्क्विशचिन्डी के लिए टिकट जमा करने में सक्षम होने के लिए अपने माणिक के भीतर रेल एप्लिकेशन पर एक उपयोगकर्ता के लिए चाहूंगा। उनके पास एक एपीआई और निर्देश निम्नानुसार है। आपको प्रमाणित करने और टोकन प्राप्त करने की आवश्यकता है और फिर टोकन के साथ टिकट जमा करें। स्क्विशलिस्ट से।

# 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 के बारे में ज्यादा नहीं जानता। क्या मुझे कुछ ऐसा इस्तेमाल करना चाहिए जो आसान हो। क्या मुझे इसे जमा करने के लिए 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 "शीर्षक" को स्वीकार करने के लिए संवेदी है। तो हैडर होना चाहिए :headers => { 'Content-Type' => 'application/json', 'Accept' => 'application/json'}। नोट: शीर्षलेख को JSON में परिवर्तित नहीं किया जाना चाहिए, यह हैश
देवरूप

मैंने एक रेल इंजन (एक रत्न के रूप में पैक) को तैनात किया, जो रेल पर एपीआई को डीबग करने के लिए वास्तव में उपयोगी है। आपको बस इंजन को माउंट करना होगा और उस url पर जाना होगा जिसे आपने निर्दिष्ट किया है, अर्थात "localhost: 3000 / api_explorer" इसे देखने के लिए। यह एक एपीआई का दस्तावेजीकरण करने का एक तरीका है, एक फ़ाइल से वेबसर्विस विनिर्देश को पढ़ना। मणि को 'api_explorer' नाम दिया गया है और रेपो को github.com/toptierlabs/api_explorer जाता है। :)
टोनी

6
यह सिर्फ मूर्खतापूर्ण है कि यह प्रलेखन में नहीं है।
टायलर कोलियर

धन्यवाद! यह महान काम किया! प्रश्न, हालांकि: आप एक JSON सरणी कैसे शामिल करेंगे?
रुबेन मार्टिनेज जूनियर

1
उपरोक्त प्रारूप की तरह संग्रह डेटा को 90k पुश करना चाहते हैं। क्या मैं पूरे डेटा को सिंगल एपीआई कॉल में पुश कर सकता हूं? कृपया मुझे अपनी टिप्पणियों को बताएं
राजू अकुला

14

:query_string_normalizerविकल्प भी उपलब्ध है जो कि डिफ़ॉल्ट नॉर्मलाइज़र को पार कर जाएगीHashConversions.to_params(query)

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

बहुत बढ़िया! यह हैश को स्टोर करने की अनुमति देता है request.options[:body]लेकिन सही स्ट्रिंग भेजता है। यह प्रश्न का वास्तविक उत्तर होना चाहिए।
फ्रीमैनॉइड

विकल्प को वर्ग में एक डिफ़ॉल्ट के रूप में भी सेट किया जा सकता है जिसमें HTTParty शामिल है query_string_normalizer वर्ग विधि के साथ, देखें: ruby-doc.org/gems/docs/h/httparty2-0.7.10/HT3arty/…
Fryie

सामग्री-प्रकार हेडर सेट करने के लिए भी आवश्यक हो सकता है: ruby-doc.org/gems/docs/h/httparty2-0.7.10/HTTParty/…
Fryie

1
query_string_normalizerडेटा स्ट्रिंग के लिए उपयोग किया जाना चाहिए, पोस्ट डेटा नहीं।
जोसेफ्रेडर

ruby-doc.orgमृत होने के लिए लिंक , दस्तावेजीकरण डॉकटरशिप
yacc
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.