2016-05-20 11 views
0

Ich versuche, diese cURL Anfrage zu übersetzen:cURL Anfrage an Python (unter Verwendung von multipart/form-data)

curl -X POST "endpoint" -H 'Content-Type: multipart/form-data' -F "[email protected]" 

Bisher habe ich diese bekam:

requests.post(
    endpoint, 
    headers={"Content-Type": "multipart/form-data"}, 
    files={"config": ("conf.ttl", open("conf.ttl", "rb"), "text/turtle")} 
) 

Aber es doesn‘ t arbeiten ganz wie erwartet. Was fehlt mir?

+1

Nicht sicher, aber ich glaube, dass Sie "Config" in "Datei" ändern möchten. – DeepSpace

Antwort

1

Sie sollten "multipart/form-data" nicht explizit festlegen. Es überschreibt alle anderen Teile des Headers, die durch Anfragen festgelegt wurden ("multipart/form-data; boundary = 4b9 ...",). Es ist nicht notwendig, den Header zu setzen, Anfragen erledigen das für Sie. Sie können die Anforderungsheader (requests.headers) im folgenden Beispiel sehen. Sie können sehen, dass

import requests 
endpoint = "http://httpbin.org/post" 
r = requests.post(
    endpoint, 
    files={"config": ("conf.ttl", open("conf.ttl", "rb"), "text/turtle")} 
) 
print r.request.headers 
print r.headers 
print r.text 

gibt:

{'Content-Length': '259', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'User-Agent': 'python-requests/2.10.0', 'Connection': 'keep-alive', 'Content-Type': 'multipart/form-data; boundary=4b99265adcf04931964cb96f48b53a36'} 
{'Content-Length': '530', 'Server': 'nginx', 'Connection': 'keep-alive', 'Access-Control-Allow-Credentials': 'true', 'Date': 'Fri, 20 May 2016 20:50:05 GMT', 'Access-Control-Allow-Origin': '*', 'Content-Type': 'application/json'} 
{ 
    "args": {}, 
    "data": "", 
    "files": { 
    "config": "curl -X POST \"endpoint\" -H 'Content-Type: multipart/form-data' -F \"[email protected]\"\n\n" 
    }, 
    "form": {}, 
    "headers": { 
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Content-Length": "259", 
    "Content-Type": "multipart/form-data; boundary=4b99265adcf04931964cb96f48b53a36", 
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.10.0" 
    }, 
    "json": null, 
    "origin": "84.92.144.93", 
    "url": "http://httpbin.org/post" 
} 

Wo, wie Sie den Code mit dem expliziten Header einen Fehler auf den gleichen URL gibt.

{'Content-Length': '259', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'User-Agent': 'python-requests/2.10.0', 'Connection': 'keep-alive', 'Content-Type': 'multipart/form-data'} 
{'Date': 'Fri, 20 May 2016 20:54:34 GMT', 'Content-Length': '291', 'Content-Type': 'text/html', 'Connection': 'keep-alive', 'Server': 'nginx'} 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> 
<title>500 Internal Server Error</title> 
<h1>Internal Server Error</h1> 
<p>The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.</p> 
+0

Das funktioniert, danke. Ich habe deine Antwort akzeptiert. Sagt es irgendwo in der Dokumentation (dass es nicht nötig ist, den Request-Header explizit zu setzen)? –

+0

Nein, nicht wirklich, aber in den Beispielen wird es nicht benutzt. –