HTTP REST Resource mit POST

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
shor
User
Beiträge: 13
Registriert: Montag 7. April 2008, 22:18

Hallo!

Ich würde gerne an eine REST Resource (Adresse: http://192.168.1.4/ws/restResourcenName) Daten übermitteln. Dabei muss man sich vorher authentifizieren. Irgendwie will das nicht so richtig klappen obwohl ich per GET schon die Ressource abfragen kann. Hier mein Code:

Code: Alles auswählen

from urllib.request import Request, urlopen
from pprint import pprint
import http.client, urllib.parse

# create a password manager
password_mgr = urllib.request.HTTPPasswordMgrWithDefaultRealm()

# Add the username and password.
username = 'user'
password = 'pass' 

# If we knew the realm, we could use it instead of None.
top_level_url = 'http://192.168.1.4/ws'
password_mgr.add_password(None, top_level_url, username, password)

handler = urllib.request.HTTPBasicAuthHandler(password_mgr)

# create "opener" (OpenerDirector instance)
opener = urllib.request.build_opener(handler)


# Install the opener.
# Now all calls to urllib.request.urlopen use our opener.
urllib.request.install_opener(opener)


url = 'http://192.168.1.4/ws'

resource = 'restResourcenName'
value = '''Zu
           übermittlender
           Text'''

values = { resource : value }


response = urllib.request.urlopen(url+resource,value)
the_page = response.read()
print (the_page)
Ich bekomme einen Internal Server Error.
Mit einem zuvor programmierten Perl Skript geht es einwandfrei also kann der String (value) an sich nicht falsch sein.
Mache ich da irgendwas bei der Übergabe an urlopen falsch?

Gruß,
shor
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Das hier http://code.google.com/p/python-rest-client/ könntest du dir mal ansehen.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Also auf den ersten Blick stimmt schon mal die Adresse der Ressource nicht, da fehlt ein Slash.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
shor
User
Beiträge: 13
Registriert: Montag 7. April 2008, 22:18

Hallo!

Stimmt der Slash hat gefehlt. Seltsamerweise macht es zumindest von der Fehlermeldung her, wohl keinen Unterschied.

Ich schau mir grad mal dan REST Client von Google an...

Danke!
shor
shor
User
Beiträge: 13
Registriert: Montag 7. April 2008, 22:18

Danke für den Tip, nach studieren der Google API bin ich auf den Fehler gekommen:

Man muss zuerst ein Request Objekt anlegen und diesem einem Header mitgeben. Dieses muss dann urlopen() übergeben werden.
(siehe unten)

Code: Alles auswählen

length = len(value)
headers = {"Content-Length": str(length), "Content-Type":"text/xml"} 
         
request = urllib.request.Request(self.url+resource,value,headers)
            
response = urllib.request.urlopen(request)
Grüße,
shor
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

shor hat geschrieben:Ich schau mir grad mal dan REST Client von Google an...
Falls du den Link von Dauerbaustelle meinst: Der Code ist nicht von Google, nur die Plattform, auf der er bereitgestellt wird.
Antworten