2012-01-10 14 views
13

मैं python requests का उपयोग कर एक निजी HTTP-एपीआई के लिए क्लाइंट लाइब्रेरी को लागू कर रहा हूँ। एपीआई (जिसे मैं नियंत्रित नहीं करता) उम्मीद करता है कि पैरामीटर एक निश्चित क्रम में हों, लेकिन पायथन-अनुरोध पैरामीटर के रूप में सॉर्ट किए गए निर्देश का सम्मान नहीं करते हैं।अजगर-अनुरोध: आदेश प्राप्त मानकों

यह मैं क्या करने की कोशिश की है:

requests.get('https://example.org?{0}'.format(urlencode(params))) 
+0

अनुरोध प्राप्त करते समय आप 'पैराम्स' के बजाय 'डेटा' param का उपयोग क्यों करते हैं? –

+0

@ पियोट्र डोबोगोस्ट: जब मैंने उदाहरण संकलित किया तो यह एक त्रुटि थी। – tback

+0

यह एक मुद्दा क्यों है? जीईटी पैरामीटर आमतौर पर क्रमशः नाम से नहीं पहुंचते हैं। –

उत्तर

9

वर्तमान में अनुरोध यह करने के लिए के रूप में आप चाहते हैं अनुमति नहीं देता:

import requests 
from django.utils.datastructures import SortedDict 

params = SortedDict() 
params['s'] = 'value1' 
params['f'] = 'value2' 

requests.get('https://example.org/private_api', params=params) 
#performs request as https://example.org/private_api?f=value1&s=value2 

यह है कि मैं क्या से बचने के लिए कोशिश कर रहा हूँ है। यह निश्चित रूप से कमी है fixed होगा। models.py की लाइन 85 में बग के कारण

from collections import OrderedDict 
from urllib import urlencode 
import requests 

params = OrderedDict([('first', 1), ('second', 2), ('third', 3)]) 
requests.get('https://example.org/private_api', params=urlencode(params)) 

यह काम नहीं करता मैं देख:: हालांकि के रूप में params पैरामीटर न केवल शब्दकोश ले लेकिन साथ ही बाइट्स सकते हैं जिन्हें आप के बीच में कुछ करने में सक्षम होना चाहिए self.params = dict(params or [] । मैं अंक में इस समस्या को उठाया Wrong handling of params given as bytes object

+0

धन्यवाद, मैंने अंत में इसे समाधान के रूप में चिह्नित किया क्योंकि यह समाधान प्रदान करता है जो निकट भविष्य में लागू होता है। – tback

+0

@ टिलबैकहॉस पहले से ही [निश्चित] (https://github.com/kennethreitz/requests/commit/9e953f33209545bbbd338e06fb2abc2c62c13212)। –

+0

यह किस संस्करण के लिए काम करता है? जब मैंने इसे '1.2.3' और' 2.0.0', 'request.get ('http://example.org/private_api', पैराम्स = urlencode (पैरा)) में आज़माया। Request.body' वापस लौटा 'कोई नहीं ' – Jian

1

लाइन 85 requests/models.py (link) की, एक सादे dict में params वस्तु बदल जाता है के बजाय SortedDict आप में पारित कर दिया। मुझे नहीं लगता कि आप आप क्या चाहते हैं ऐसा करने में सक्षम हो जाएगा , जब तक आप पुस्तकालय पैच नहीं करते।

self.params = dict(params or []) 
+0

मुझे लगता है कि विकल्पों को ध्यान में रखते हुए मुझे उस समय से जाना होगा जो मैं बचने की कोशिश कर रहा था। धन्यवाद। – tback

17

अनुरोध lib अब इस आउट ऑफ़ द बॉक्स का समर्थन करता है: आदेशित पैरामीटर प्राप्त करने के लिए आप इसके बजाय दो मूल्यवान tuples का अनुक्रम उपयोग करते हैं। यह OrderedDict की अतिरिक्त आवश्यकता को समाप्त करता है।

payload = (('key1', 'value1'), ('key2', 'value2')) 
r = requests.get("http://httpbin.org/get", params=payload) 

डेमो:

>>> import requests 
>>> requests.__version__ 
1.2.3 
>>> payload = (('key1', 'value1'), ('key2', 'value2'), ('key3', 'value3')) 
>>> r = requests.get("http://httpbin.org/get", params=payload) 
>>> print r.json()['url'] 
http://httpbin.org/get?key1=value1&key2=value2&key3=value3 
0

मैंने पाया कि इस रूप में अच्छी तरह 1.2.3 में काम करता है के रूप में 2.0.0

>>> import requests 
>>> requests.__version__ 
'2.0.0' 
>>> data = [('first', 1), ('second', 2), ('third', 3)] 
>>> requests.get('http://example.org/private_api', data=data).request.body 
'first=1&second=2&third=3' 
1

यह संस्करण 2.2.0 के साथ प्रयोग किया है:

import requests 
yourparams = {'s' : 'value1', 'f': 'value2'} 

test = requests.get('https://example.org/private_api', params=yourparams) 
print(test.url) 

अधिक विवरण? कृपया here में जांचें।

+0

यह ओपी द्वारा अनुरोध किए गए पैराम्स के क्रम को सुरक्षित नहीं करता है। –