将Curl请求转换为Python请求

将Curl请求转换为Python请求,python,Python,下面是我试图更改为python代码的示例curl请求: curl 'http://127.0.0.1:5985/_api/v2/ws/test2/upload_report' \ -H 'Content-Type: multipart/form-data' \ --cookie "session=.eJw90M2KwjAQB_BXWXL2YGu9CB6UlGJhpgSCZeZS2FpNJ2YXqkI24rtv18O-wO__8VTdeRpuTm3u02NYqG48qc1TfXyq

下面是我试图更改为python代码的示例curl请求:

 curl  'http://127.0.0.1:5985/_api/v2/ws/test2/upload_report' \
   -H 'Content-Type: multipart/form-data' \
   --cookie "session=.eJw90M2KwjAQB_BXWXL2YGu9CB6UlGJhpgSCZeZS2FpNJ2YXqkI24rtv18O-wO__8VTdeRpuTm3u02NYqG48qc1TfXyqjWK9SyyUYVsWmMrUWDei9Etsj4FaDKydw-Qj5KZo9CWSNUu2uzXktQM5XSnxyJVZgTaRrYkk-xEt5ZQfVmT3DmcfKvrhcBQUKMgeIoQysb0knjMh-QIEliyQQzJZ0-IV_kx7DWDZY1WPmNCD9Fv1Wqj-Np27-7cfvv4noNTSVCZjXSaYK2KgiLqMTTtX1H7daMpmPnLFgtpHSk7YbN_c4zZM7ztUoV6_3rRiDA.DkoypQ.q7eGzh1oof8dKnbF4q6xD_n1d6o" \
   --form "file=@PATH/TO/FILE" \
   --form "csrf_token=IjYyYzhkNWQxMzA4MTZmMTQxMTliYTA5OTg2NWYzMWRmYzQ5MWM4Y2Ui.Dko4Zw.sZ-LLdGoxaNFUaySFFQMvyLecxc" \
   --compressed
我有下面的python代码来尝试上传文件吗?但是,API返回400错误

CSRF_TOKEN = get_csrf(session,token)
files = {"file": open(os.getcwd()+'/test.xml',"rb")}
data = {"csrf_token": CSRF_TOKEN, "file": os.getcwd() + "/test.xml"}
res = session.post(BASE_URI + '/_api/v2/ws/test2/upload_report', verify=False, files=files, data=data, headers={'Content-Type': 'multipart/form-data'}, cookies={'session':token})
print res.text, res.status_code
pdb.set_trace()

不要设置内容类型标题,多部分/表单数据请求必须包含边界值,并且当您使用
文件时,请求会自动为您处理该边界值。通过手动设置,您实际上要求
请求
不要为您处理此问题,这样做违反了要求

此外,您不需要将
文件设置两次。在
文件
结构中只设置一次:

CSRF_TOKEN = get_csrf(session,token)
files = {"file": open(os.getcwd()+'/test.xml',"rb")}
data = {"csrf_token": CSRF_TOKEN}
res = session.post(
    BASE_URI + '/_api/v2/ws/test2/upload_report', verify=False, 
    files=files, data=data,
    cookies={'session': token})
我还将以上下文管理器的形式打开文件对象,以便在收到响应时将其关闭:

CSRF_TOKEN = get_csrf(session,token)
data = {"csrf_token": CSRF_TOKEN}

with open('test.xml', "rb") as file_to_post:
    files = {"file": file_to_post}
    res = session.post(
        BASE_URI + '/_api/v2/ws/test2/upload_report', verify=False, 
        files=files, data=data,
        cookies={'session': token})

您根本不需要使用
os.getcwd()
,任何相对路径都将针对当前工作目录进行解析。

不要设置内容类型头,多部分/表单数据请求必须包含边界值,并且当您使用
文件时,请求会自动为您解决此问题。通过手动设置,您实际上要求
请求
不要为您处理此问题,这样做违反了要求

此外,您不需要将
文件设置两次。在
文件
结构中只设置一次:

CSRF_TOKEN = get_csrf(session,token)
files = {"file": open(os.getcwd()+'/test.xml',"rb")}
data = {"csrf_token": CSRF_TOKEN}
res = session.post(
    BASE_URI + '/_api/v2/ws/test2/upload_report', verify=False, 
    files=files, data=data,
    cookies={'session': token})
我还将以上下文管理器的形式打开文件对象,以便在收到响应时将其关闭:

CSRF_TOKEN = get_csrf(session,token)
data = {"csrf_token": CSRF_TOKEN}

with open('test.xml', "rb") as file_to_post:
    files = {"file": file_to_post}
    res = session.post(
        BASE_URI + '/_api/v2/ws/test2/upload_report', verify=False, 
        files=files, data=data,
        cookies={'session': token})
您根本不需要使用
os.getcwd()
,任何相对路径都将针对当前工作目录进行解析