【问题标题】:curl statement `--form input=@./thefile.pdf` in python requestspython请求中的curl语句`--form input=@./thefile.pdf`
【发布时间】:2016-03-19 04:51:22
【问题描述】:

我有一个 curl 声明,取自 link:

curl -v -include --form input=@./thefile.pdf localhost:8080/processFulltextDocument

我正在尝试使用 Requests 在 Python 中复制上述语句,因此我正在使用以下代码

    import requests
    Data = {'input': './samp.pdf'}
    url='http://127.0.0.1:8080/processFulltextDocument'
    r = requests.post(url,data=Data)
    print r.text

但是,我收到 415 错误。我做错了什么?

EDIT curl语句的头部如下:

curl -v -include --form input=@./samp.pdf 127.0.0.1:8080/processFulltextDocument

* Couldn't find host 127.0.0.1 in the .netrc file; using defaults
* Hostname was NOT found in DNS cache
*   Trying 127.0.0.1...
* Connected to 127.0.0.1 (127.0.0.1) port 8080 (#0)
> POST /processFulltextDocument HTTP/1.1
> User-Agent: curl/7.35.0
> Host: 127.0.0.1:8080
> Accept: */*
> Content-Length: 549488
> Expect: 100-continue
> Content-Type: multipart/form-data; boundary=------------------------df1c59f42e57cbf4
> 
< HTTP/1.1 100 Continue
HTTP/1.1 100 Continue

【问题讨论】:

  • 使用 @ 作为文件名特定于 curl,参见例如unix.stackexchange.com/questions/144479/…
  • @jonrsharpe 我删除了@,但我仍然收到错误
  • 那么您只是发布文件名。如果你不理解你复制的代码,翻译它几乎是不可能的。
  • @jonrsharpe 我也试过{'input': open('./samp.pdf', 'rb')},但仍然报错
  • 作为参考,假设 HTTP 错误代码被正确使用,415 是一个“不支持的媒体类型”HTTP 错误。

标签: python curl python-requests


【解决方案1】:

要发送“multipart/form-data” POST http 请求,请使用files 参数:

#!/usr/bin/env python
import requests  # $ pip install requests

r = requests.post('http://127.0.0.1:8080/processFulltextDocument',
                  files=dict(input=open('samp.pdf', 'rb')))
print(r.text) # print response

POST a Multipart-Encoded File

【讨论】:

    【解决方案2】:

    虽然 @ 是 curl 独有的,但您可以在请求中执行此操作(应该可以):

    import requests
    Data = {'input': open('./samp.pdf', 'rb')}
    
    url='http://127.0.0.1:8080/processFulltextDocument'
    r = requests.post(url,data=Data)
    print r.text
    

    更新 2:

    代码 sn-p 错误。将r = requests.post(url,data=Data) 更改为r = requests.post(url,files=Data),这将起作用。复制粘贴错误。

    另请参阅:Example on Requests website

    更新 1: 这会将文件作为发布请求中的字段传递。你可以像这样传递它(我认为):

    import requests
    Data = open('./samp.pdf', 'rb').read()
    
    url='http://127.0.0.1:8080/processFulltextDocument'
    r = requests.post(url,data=Data)
    print r.text
    

    【讨论】:

    • 添加了一个更新:也许您需要将文件作为帖子正文传递 (??)
    • 恐怕我之前已经尝试过了。没用。 curl 语句虽然效果很好
    • @Ekoji 您是否尝试过详细模式以查看它实际发送的内容(例如stackoverflow.com/questions/866946/…)?
    • @jonrsharpe 或者我应该尝试 pycurl 吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多