2016-05-12 4 views
0

Ich versuche, ein Powershell-Äquivalent für dieses Python-Code zu machen:Powershell-Äquivalent für Python requests.post mit beiden Daten und Dateien

import requests 
requests.post('http://someCKANsite/api/action/resource_create', 
       data={"package_id":"my_dataset"}, 
       headers={"X-CKAN-API-Key": "21a47217-6d7b-49c5-88f9-72ebd5a4d4bb"}, 
       files=[('upload', file('/path/to/file/to/upload.csv'))]) 

ich versucht habe:

Invoke-WebRequest -Method Post -Uri http://someCKANsite/api/action/resource_create -Headers $headers -InFile $myfile -Body $rcbody -ContentType "multipart/form-data" 

... mit $headers enthält meine X-CKAN-API-Key und $rcbody enthält die package_id. Aber ich bekomme den Fehler Invoke-WebRequest : The cmdlet cannot run because the following conflicting parameters are specified: Body and InFile. Specify either Body or Infile, then retry.

Ich habe versucht, setzen ?package_id=... am Ende des Uri, aber das funktioniert nicht. Ich habe alle möglichen Kombinationen in der Advanced REST client ausprobiert, aber auch ohne Erfolg. Ich habe auch versucht Invoke-RestMethod, aber es hat die gleichen Probleme.

Antwort

1

Sie können nicht beide angeben; da die -InFile im Grunde nur den Inhalt der Datei als einen Körper (der in Konflikt wäre) mit Ihrem bestehenden Körper hinzufügt.

Sie kann jedoch den Körper mit Dateien konstruieren selbst so etwas wie dies zu tun (das gleiche für invoke-webrequest/oder aufrufen-restmethod):

$body = "upload=$(get-content c:\yourfile.csv -Enc Byte -raw)&package_id=my_dataset" 
Invoke-RestMethod -Method $method -Headers $headers -Uri ($server+$uri) -body $body 

Hier habe ich nur mehr Parameter in Ihrem Körper hinzugefügt von concatting sie (& package_id =). Sie sollten wissen, wie der Server Ihre Parameter verarbeitet.

Werden sie vom Körper gelesen (wie ich hier annehme) oder als Teil der URL-Zeichenfolge? Sie können auf einfache Weise sehen, wie die Anforderung übergeben wird (z. B. mit fiddler), wenn Sie das Python aufrufen und anschließend das invoke-webrequst/invoke-restmethod anpassen.

Hoffe, das hilft :)

+1

Ich habe ein wenig Mühe zu sehen, ob die Datei ordnungsgemäß hochgeladen wird. Ich erhalte vom REST-Client ein Ergebnis von 200, aber in PowerShell erhalte ich einen 500-Fehler. Und selbst nach 200 vom REST-Client scheint die Datei nicht korrekt hochgeladen zu sein. Ich benutze jetzt die Option "resource_update", aber selbst Python macht mich verrückt ... –

Verwandte Themen