Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Python] Jak wysłać zapytanie tego typu?
Forum PHP.pl > Forum > Przedszkole
Babcia@Stefa
Witam.

Męczę się od wczoraj z wysłaniem odpowiednio sformatowanego zapytania przy pomocy Pythona.

Obsługa XML-RPC to jakaś kpina, tak więc spróbowałem PyCURL oraz HTTLib, doszłem troszkę dalej ale jednak wciąż niewystarczająco daleko.

Do rzeczy, potrzebuję wysłać takie zapytanie:

Kod
POST /dupa HTTP/1.0
User-Agent: XML-RPC for PHP 3.0.0.beta
Host: webnull.kablownia.org:81
Accept-Charset: UTF-8,ISO-8859-1,US-ASCII
Content-Type: text/xml
Content-Length: 325

<?xml version="1.0"?>
<methodCall>
<methodName>LogIn</methodName>
<params><param>
<value><string></string></value>
</param>
<param>
<value><string></string></value>
</param>
<param>
<value><string></string></value>
</param>
<param>
<value><string>OS Test User Agent</string></value>
</param></params>
</methodCall>


Najlepiej przy pomocy jakiejś biblioteki a nie na raw socketach (program ma działać bez uprawnień roota).

Gdzie tu jest mój problem?

Otóż za nic nie mogę wysłać zapytania sformatowanego w ten sposób, a konkretnie samego kodu XML.
Kod XML udało mi się wysłać metodą uploadu, ale serwer tego nie rozumie - potrzebuję wysłać tak jak jest na tym przykładowym schemacie.
Przykład który podałem jest wygenerowany przy pomocy PHP - zesniffowałem go Wiresharkiem wysyłając zapytanie z debuggera do komputera którego używam (sniffer na moim komputerze w celu przechwycenia poprawnego schematu).

Proszę o pomoc, jestem bardzo chętny do przyznania "Pomógł" za Twoją pomoc : -)

-- WebNuLL
mat-bi
Trochę źle trafiłeś(aś), tutaj to php. smile.gif

Radzę czasami użyc google - http://www.python.rk.edu.pl/w/p/pycurl-i-zadania-http/
Babcia@Stefa
Wiem, że to forum od PHP ale można tu także napisać temat odnośnie Pythona bo wiem, że wielu ludzi tutaj także zna Pythona.

Mogę założyć się, że jest tu dużo użytkowników Linuksa i Pythona.

Niestety ale ten przykład nie podaje mi jak wysłać dokładnie takie zapytanie.

Ten przykład przedstawia upload który będzie wyglądać mniej wiecej tak:

Kod
POST / HTTP 1.1
Content-length: długość
Nagłówek: wartość
Content-type: typ mime

-- boundary blablabla
treść
-- end of boundary


A ja potrzebuję czegoś takiego:

Kod
POST / HTTP 1.1
Content-length: długość
Nagłówek: wartość
Content-type: typ mime

treść


PHP potrafi coś takiego wysłać, Python na pewno też potrafi dlatego pytam się jak i zwracam o pomoc ponieważ sam już do tego nie mam sił.

@edit
Zesniffowałem ten przykład który podałeś i wygląda mniej więcej tak:

Kod
POST /test HTTP/1.1
User-Agent: Mozilla/5.0 (X11; Linux i686; rv:2.0.1) Gecko/20100101 Firefox/4.0.1
Host: localhost
Accept: */*
Content-Length: 564
Expect: 100-continue
Content-Type: multipart/form-data; boundary=----------------------------a830acfa532c

tutaj treść xmla


Ja nie mogę wysłać do serwera multipart/form-data, ja muszę wysłać w jednym pakiecie text/xml, to po tak komplikować.

@edit
Oto rozwiązanie, jakoś do niego doszedłem:

Kod
XMLData = """<?xml version="1.0"?>
<methodCall>
<methodName>LogIn</methodName>
<params><param>
<value><string></string></value>
</param>
<param>
<value><string></string></value>
</param>
<param>
<value><string></string></value>
</param>
<param>
<value><string>"""+userAgent+"""</string></value>
</param></params>
</methodCall>"""

    sendHeaders = {
         'Content-Length': str(len(XMLData)),
         'User-Agent': userAgent,
         'Content-Type': 'text/xml',
         'Accept-Charset': 'UTF-8,ISO-8859-1,US-ASCII'
                  }

    conn = httplib.HTTPConnection('api.opensubtitles.org')
    conn.request("POST", "/xml-rpc", XMLData, sendHeaders)
    response = conn.getresponse()
    data = response.read()

    print data


-- WebNuLL
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.