पाइथन हेडर के साथ POST भेजते हैं


85

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

POST /Services/GetFromDataBaseVersionned HTTP/1.1
Host: www.mywbsite.fr
"Connection": "keep-alive",
"Content-Length": 129,
"Origin": "https://www.mywbsite.fr",
"X-Requested-With": "XMLHttpRequest",
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.52 Safari/536.5",
"Content-Type": "application/json",
"Accept": "*/*",
"Referer": "https://www.mywbsite.fr/data/mult.aspx",
"Accept-Encoding": "gzip,deflate,sdch",
"Accept-Language": "fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4",
"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.3",
"Cookie": "ASP.NET_SessionId=j1r1b2a2v2w245; GSFV=FirstVisit=; GSRef=https://www.google.fr/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CHgQFjAA&url=https://www.mywbsite.fr/&ei=FZq_T4abNcak0QWZ0vnWCg&usg=AFQjCNHq90dwj5RiEfr1Pw; HelpRotatorCookie=HelpLayerWasSeen=0; NSC_GSPOUGS!TTM=ffffffff09f4f58455e445a4a423660; GS=Site=frfr; __utma=1.219229010.1337956889.1337956889.1337958824.2; __utmb=1.1.10.1337958824; __utmc=1; __utmz=1.1337956889.1.1.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=(not%20provided)"

{"isLeftColumn":false,"lID":-1,"userIpCountryCode":"FR","version":null,"languageCode":"fr","siteCode":"frfr","Quotation":"eu"}

और अब मेरी अजगर स्क्रिप्ट:

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-
import string
import httplib
import urllib2

host = "www.mywbsite.fr/sport/multiplex.aspx"
    params='"isLeftColumn":"false","liveID":"-1","userIpCountryCode":"FR","version":"null","languageCode":"fr","siteCode":"frfr","Quotation":"eu"'

headers = { Host: www.mywbsite.fr,
"Connection": "keep-alive",
"Content-Length": 129,
"Origin": "https://www.mywbsite.fr",
"X-Requested-With": "XMLHttpRequest",
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.52 Safari/536.5",
"Content-Type": "application/json",
"Accept": "*/*",
"Referer": "https://www.mywbsite.fr/data/mult.aspx",
"Accept-Encoding": "gzip,deflate,sdch",
"Accept-Language": "fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4",
"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.3",
"Cookie": "ASP.NET_SessionId=j1r1b2a2v2w245; GSFV=FirstVisit=;     GSRef=https://www.google.fr/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CHgQFjAA&url=https://www.mywbsite.fr/&ei=FZq_T4abNcak0QWZ0vnWCg&usg=AFQjCNHq90dwj5RiEfr1Pw; HelpRotatorCookie=HelpLayerWasSeen=0; NSC_GSPOUGS!TTM=ffffffff09f4f58455e445a4a423660; GS=Site=frfr; __utma=1.219229010.1337956889.1337956889.1337958824.2; __utmb=1.1.10.1337958824; __utmc=1; __utmz=1.1337956889.1.1.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=(not%20provided)"

}

url = "/Services/GetFromDataBaseVersionned"

# POST the request
conn = httplib.HTTPConnection(host,port=443)
conn.request("POST",url,params,headers)
response = conn.getresponse()

data = response.read()
print data

लेकिन जब मैं अपनी स्क्रिप्ट चलाता हूं, तो मुझे यह त्रुटि होती है:

socket.gaierror: [Errno -2] Name or service not known

7
HTTP को मैन्युअल रूप से बोलने का कोई अच्छा कारण नहीं है। Urllib या इससे भी बेहतर, अनुरोधों का उपयोग करें ।
ThiefMaster

1
बेहतर स्पष्टीकरण के लिए इस उत्तर को देखें। stackoverflow.com/a/51124572/7384392
Nitanshu

जवाबों:


106

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

import requests
import json

url = 'https://www.mywbsite.fr/Services/GetFromDataBaseVersionned'
payload = {
    "Host": "www.mywbsite.fr",
    "Connection": "keep-alive",
    "Content-Length": 129,
    "Origin": "https://www.mywbsite.fr",
    "X-Requested-With": "XMLHttpRequest",
    "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.52 Safari/536.5",
    "Content-Type": "application/json",
    "Accept": "*/*",
    "Referer": "https://www.mywbsite.fr/data/mult.aspx",
    "Accept-Encoding": "gzip,deflate,sdch",
    "Accept-Language": "fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4",
    "Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.3",
    "Cookie": "ASP.NET_SessionId=j1r1b2a2v2w245; GSFV=FirstVisit=; GSRef=https://www.google.fr/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CHgQFjAA&url=https://www.mywbsite.fr/&ei=FZq_T4abNcak0QWZ0vnWCg&usg=AFQjCNHq90dwj5RiEfr1Pw; HelpRotatorCookie=HelpLayerWasSeen=0; NSC_GSPOUGS!TTM=ffffffff09f4f58455e445a4a423660; GS=Site=frfr; __utma=1.219229010.1337956889.1337956889.1337958824.2; __utmb=1.1.10.1337958824; __utmc=1; __utmz=1.1337956889.1.1.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=(not%20provided)"
}
# Adding empty header as parameters are being sent in payload
headers = {}
r = requests.post(url, data=json.dumps(payload), headers=headers)
print(r.content)

5
आप हेडर को अनुरोध के डेटा के रूप में क्यों भेज रहे हैं और यह क्यों काम करता है?
थियागो बाल्बो

15
FYI करें आपको मैन्युअल रूप से हेडर को इस तरह नहीं भेजना चाहिए । यह अनुरोध का काम है। आपको भेजने के लिए अधिकतम उपयोगकर्ता एजेंट और कस्टम हेडर होना चाहिए।
एंटोनी बोल्वी

3
json.dumps क्या करता है?
py_ios_dev

1
@Engin Yapici आमतौर पर हमें अपने डेटा को json के रूप में डंप करने की आवश्यकता नहीं होती है, लेकिन कुछ विशेष मामले में हमें इसकी आवश्यकता होती है। जैसे FASTAPI में पोस्ट रिक्वेस्ट भेजना, यह हमारे डेटा को json के रूप में डंप करना है।
विली सैत्रियो नोग्रोहो

1
@Willysatrionugroho - सहमत हुए। मैं बिना पेलोड को पास करने की कोशिश कर रहा था json.dumps()और यह विफल हो गया, बहुत निराश हो गया। यह उत्तर मिला, प्रयुक्त json.dumps()और एपीआई एक आकर्षण की तरह काम करता है।
इलापास्टर

74

अगर हम कस्टम HTTP हेडर को एक पोस्ट अनुरोध में जोड़ना चाहते हैं , तो हमें उन्हें एक डिक्शनरी के माध्यम से headers पैरामीटर में पास करना होगा ।

यहाँ एक गैर-खाली शरीर और शीर्ष लेख के साथ एक उदाहरण दिया गया है :

import requests
import json

url = 'https://somedomain.com'
body = {'name': 'Maryja'}
headers = {'content-type': 'application/json'}

r = requests.post(url, data=json.dumps(body), headers=headers)

स्रोत


2

GET अनुरोध के बजाय POST अनुरोध का उपयोग करने के लिए urllib2, आपको खाली डेटा निर्दिष्ट करने की आवश्यकता है, उदाहरण के लिए:

import urllib2
req = urllib2.Request("http://am.domain.com:8080/openam/json/realms/root/authenticate?authIndexType=Module&authIndexValue=LDAP")
req.add_header('X-OpenAM-Username', 'demo')
req.add_data('')
r = urllib2.urlopen(req)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.