পাইথন ব্যবহার করে একটি RESTful এপিআইতে একটি অনুরোধ করা


221

আমার কাছে একটি RESTful API রয়েছে যা আমি ইসি 2 উদাহরণে ইলাস্টিকসার্কের প্রয়োগটি ব্যবহার করে সামগ্রীর একটি কর্পাসকে সূচক করতে প্রকাশ করেছি। আমি আমার টার্মিনাল (ম্যাকোএসএক্স) থেকে নিম্নলিখিতটি চালিয়ে অনুসন্ধানটি জিজ্ঞাসা করতে পারি:

curl -XGET 'http://ES_search_demo.com/document/record/_search?pretty=true' -d '{
  "query": {
    "bool": {
      "must": [
        {
          "text": {
            "record.document": "SOME_JOURNAL"
          }
        },
        {
          "text": {
            "record.articleTitle": "farmers"
          }
        }
      ],
      "must_not": [],
      "should": []
    }
  },
  "from": 0,
  "size": 50,
  "sort": [],
  "facets": {}
}'

কীভাবে আমি ( python/requestsবা python/urllib2কোনটির জন্য যাবেন তা নিশ্চিত নয় - urllib2 ব্যবহার করে যাচ্ছেন তবে কীভাবে অনুরোধগুলি আরও ভাল ...) শুনবেন কী করে আমি উপরে একটি API অনুরোধে পরিণত করব ? আমি শিরোনাম হিসাবে পাস বা অন্যথায়?

উত্তর:


340

অনুরোধগুলি ব্যবহার করে :

import requests
url = 'http://ES_search_demo.com/document/record/_search?pretty=true'
data = '''{
  "query": {
    "bool": {
      "must": [
        {
          "text": {
            "record.document": "SOME_JOURNAL"
          }
        },
        {
          "text": {
            "record.articleTitle": "farmers"
          }
        }
      ],
      "must_not": [],
      "should": []
    }
  },
  "from": 0,
  "size": 50,
  "sort": [],
  "facets": {}
}'''
response = requests.post(url, data=data)

আপনার এপিআই কী ধরণের প্রতিক্রিয়া প্রত্যাখ্যান করে তার উপর নির্ভর করে আপনি সম্ভবত দেখতে response.textবা response.json()(বা সম্ভবত response.status_codeপ্রথমে পরিদর্শন ) করতে চাইবেন । এখানে কুইকস্টার্ট ডক্স দেখুন বিশেষত এই বিভাগটি


3
আমি মনে করি, এটি হওয়া উচিত: প্রতিক্রিয়া =
অনুরোধ.পট

8
"অনুরোধ.জেট" "ডেটা" পরামিতি নেয় না। এটি alচ্ছিক "প্যারামগুলি" পরামিতি নিতে পারে যা সাধারণত কোয়েরি স্ট্রিং বহন করে এমন একটি ডিক। যদি কোনও পে-লোড ডেটা আনার জন্য প্রয়োজনীয় হয় (যেমন প্রশ্নে পোস্ট করা উদাহরণ), তবে "অনুরোধ.পস্ট" ব্যবহার করা দরকার। অতিরিক্তভাবে "json" লাইব্রেরি ব্যবহার করে json প্রতিক্রিয়া পার্স করা সহজ করে তোলে।
এইচভিএস

4
@ পারভীনশুখলা "অনুরোধগুলি পাইথনকে আনুষ্ঠানিকভাবে 2.6-22.7 এবং 3.3–3.5 সমর্থন করে এবং পাইপাইতে দুর্দান্ত চালায়" " - pypi.python.org/pypi/requests
ড্যানিও

2
এটি আপনি পাঠাচ্ছেন জেএসএন হিসাবে, আপনি এর মতো ডেটার পরিবর্তে জসন প্যারামিটার ব্যবহার করতে পারেন: প্রতিক্রিয়া = অনুরোধ.পোস্ট (ইউআরএল, জসন = ডেটা)
মার্ক চর্লি

101

অনুরোধ এবং জেসন ব্যবহার করা সহজ করে তোলে।

  1. এপিআই কল করুন
  2. ধরে নিই যে এপিআই একটি জেএসওএন রিটার্ন দেয়, json.loadsফাংশনটি ব্যবহার করে জেএসএন অবজেক্টটিকে পাইথন ডিকের মধ্যে পার্স করে
  3. তথ্য উত্তোলনের জন্য ডিকের মাধ্যমে লুপ করুন।

অনুরোধ মডিউল আপনাকে সাফল্য এবং ব্যর্থতার জন্য লুপ করতে কার্যকর ফাংশন সরবরাহ করে।

if(Response.ok): আপনার এপিআই কলটি সফল কিনা তা নির্ধারণে আপনাকে সহায়তা করবে (প্রতিক্রিয়া কোড - 200)

Response.raise_for_status() আপনাকে এপিআই থেকে ফিরে আসা HTTP কোডটি আনতে সহায়তা করবে।

নীচে এমন এপিআই কল করার জন্য একটি নমুনা কোড দেওয়া আছে। গিথুব এও পাওয়া যাবে । কোডটি ধরে নিয়েছে যে এআইপি ডাইজেস্ট প্রমাণীকরণ ব্যবহার করে। আপনি এটিকে এড়িয়ে যেতে পারেন বা এপিআই-র অনুরোধকারী ক্লায়েন্টের অনুমোদনের জন্য অন্যান্য যথাযথ প্রমাণীকরণ মডিউলগুলি ব্যবহার করতে পারেন।

#Python 2.7.6
#RestfulClient.py

import requests
from requests.auth import HTTPDigestAuth
import json

# Replace with the correct URL
url = "http://api_url"

# It is a good practice not to hardcode the credentials. So ask the user to enter credentials at runtime
myResponse = requests.get(url,auth=HTTPDigestAuth(raw_input("username: "), raw_input("Password: ")), verify=True)
#print (myResponse.status_code)

# For successful API call, response code will be 200 (OK)
if(myResponse.ok):

    # Loading the response data into a dict variable
    # json.loads takes in only binary or string variables so using content to fetch binary content
    # Loads (Load String) takes a Json file and converts into python data structure (dict or list, depending on JSON)
    jData = json.loads(myResponse.content)

    print("The response contains {0} properties".format(len(jData)))
    print("\n")
    for key in jData:
        print key + " : " + jData[key]
else:
  # If response code is not ok (200), print the resulting http error code with description
    myResponse.raise_for_status()

2
কীগুলির উপর পুনরাবৃত্তির শেষ অংশটি সর্বদা কাজ করবে না কারণ জেএসওএন নথিতে শীর্ষ স্তরের উপাদান হিসাবে অ্যারে থাকতে পারে। সুতরাং, চেষ্টা করার জন্য এটি একটি ত্রুটি হবেjData[key]
ডেনিস দ্য মেনেস

@DenisTheMenace যদি এটি একটি অ্যারে হয় তবে আমি কীভাবে এর চারপাশে লুপ করব?
কাসিমালবাখালী

আপনি যেমন অভিধানটি লুপ করেন ঠিক তেমনই কাসিমালবাকালি। তবে অ্যারের উপাদানগুলি সহজভাবে হবে jData, নয়jData[key]
ডেনিস দ্য মেনেস

সিডিনোট: যদি আপনার এপিআই একটি বড় জেএসওএন প্রতিক্রিয়া দেয় তবে আপনি এটি সুন্দরভাবে এটি মুদ্রণ করতে পারেন: print(json.dumps(jData, indent=4, sort_keys=True))
মার্কো

2
পাইথন 3 এর অধীনে, নীচে স্পট আউট করা হয়েছিল 'জেএসওএন অবশ্যই স্ট্রাইট বাইট নয়'। এটি আউটপুট ডিকোডিং দ্বারা স্থির করা হয়েছে, অর্থাৎ json.loads (myResponse.content.decode ('utf-8'))। এছাড়াও আপনার কী এবং জেডিটা কীটি str () দিয়ে মোড়ানো উচিত তাই যখন RESTful এপিআই পূর্ণসংখ্যার ফেরত আসে তখন এটি অভিযোগ করে না।
মিরকুলেস

11

সুতরাং আপনি কোনও জিইটি অনুরোধের শর্তে ডেটা পাস করতে চান, পোস্ট পোস্টে এটি করা ভাল। আপনি উভয় অনুরোধ ব্যবহার করে এটি অর্জন করতে পারেন।

কাঁচা অনুরোধ

GET http://ES_search_demo.com/document/record/_search?pretty=true HTTP/1.1
Host: ES_search_demo.com
Content-Length: 183
User-Agent: python-requests/2.9.0
Connection: keep-alive
Accept: */*
Accept-Encoding: gzip, deflate

{
  "query": {
    "bool": {
      "must": [
        {
          "text": {
            "record.document": "SOME_JOURNAL"
          }
        },
        {
          "text": {
            "record.articleTitle": "farmers"
          }
        }
      ],
      "must_not": [],
      "should": []
    }
  },
  "from": 0,
  "size": 50,
  "sort": [],
  "facets": {}
}

অনুরোধের সাথে নমুনা কল

import requests

def consumeGETRequestSync():
data = '{
  "query": {
    "bool": {
      "must": [
        {
          "text": {
            "record.document": "SOME_JOURNAL"
          }
        },
        {
          "text": {
            "record.articleTitle": "farmers"
          }
        }
      ],
      "must_not": [],
      "should": []
    }
  },
  "from": 0,
  "size": 50,
  "sort": [],
  "facets": {}
}'
url = 'http://ES_search_demo.com/document/record/_search?pretty=true'
headers = {"Accept": "application/json"}
# call get service with headers and params
response = requests.get(url,data = data)
print "code:"+ str(response.status_code)
print "******************"
print "headers:"+ str(response.headers)
print "******************"
print "content:"+ str(response.text)

consumeGETRequestSync()

সেখানে একটি মৃত লিঙ্ক পেয়েছে
user3157940

4
শিরোনাম ভেরিয়েবল ব্যবহার করা উচিত: অনুরোধ.জেট (... শিরোনাম = শিরোলেখ, ....)
মার্কাস মেয়ার

9

নীচে অজগর- এ বাকি এপিআই কার্যকর করার প্রোগ্রামটি দেওয়া হল

import requests
url = 'https://url'
data = '{  "platform": {    "login": {      "userName": "name",      "password": "pwd"    }  } }'
response = requests.post(url, data=data,headers={"Content-Type": "application/json"})
print(response)
sid=response.json()['platform']['login']['sessionId']   //to extract the detail from response
print(response.text)
print(sid)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.