Seite 1 von 1

HTTP REST Resource mit POST

Verfasst: Dienstag 28. April 2009, 15:12
von shor
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

Verfasst: Dienstag 28. April 2009, 15:35
von Dauerbaustelle
Das hier http://code.google.com/p/python-rest-client/ könntest du dir mal ansehen.

Verfasst: Dienstag 28. April 2009, 17:05
von Leonidas
Also auf den ersten Blick stimmt schon mal die Adresse der Ressource nicht, da fehlt ein Slash.

Verfasst: Mittwoch 29. April 2009, 08:37
von shor
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

Verfasst: Donnerstag 30. April 2009, 12:39
von shor
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

Verfasst: Donnerstag 14. Mai 2009, 10:44
von Y0Gi
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.