【问题标题】:Not able to post file using python with POST API?无法使用带有 POST API 的 python 发布文件?
【发布时间】:2019-05-14 11:43:47
【问题描述】:

我正在使用 Postman 发布数据,它工作正常。但是当我在 python 中转换它时,它无法读取我的文件。它在文件中给出空数据,我不知道出了什么问题。

这是python代码:

import requests
url = "http://localhost:63387/api/clientdetail"
payload = "------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; " \
      "name=\"ip\"\r\n\r\n10.2.3.5\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; " \
      "name=\"file\"; filename=\"D:\\data.json\"\r\n" \
      "Content-Type: application/json\r\n\r\n\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW--"
headers = {
'content-type': "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW",
'cache-control': "no-cache",
'Postman-Token': "adcea715-e97c-4374-80b7-30094e0861c3"
}
response = requests.request("POST", url, data=payload, headers=headers)

print(response.text)

我是从邮递员那里复制的。 在这里我传递了两个参数字符串和文件,所以字符串工作正常,但文件给出了 null。

当我使用邮递员这样做时,它给出的都是正确的

那么谁能帮帮我???

这里是邮递员 HTTP 代码

POST /api/clientdetail HTTP/1.1
Host: localhost:63387
cache-control: no-cache
Postman-Token: d614bdb0-eadd-4d29-9132-bc9443176082
Content-Type: multipart/form-data; boundary=----
WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="ip"
10.2.3.5
Content-Disposition: form-data; name="file"; filename="D:\data.json"
------WebKitFormBoundary7MA4YWxkTrZu0gW--

【问题讨论】:

  • 您似乎在最后一个 response = requests.request("POST", url, data=payload, headers=headers ) 之前的行尾缺少一个括号
  • 您的 payload 变量似乎也只存储一个字符串而不是一个文件。你是怎么想出这段代码的?你在遵循一些指南吗?如果是,请分享来源,以便我们检查
  • 您确定方法是POST 而不是PUT?你得到哪个错误?
  • 我正在从邮递员 python 请求中复制这段代码
  • @reportgunner ,在这里复制粘贴它丢失但在我的python代码右括号在那里。

标签: python postman


【解决方案1】:

阻止您直接在文件对象上使用 urlopen 的唯一原因是内置文件对象缺少 len 定义。一个简单的方法是创建一个子类,它为 urlopen 提供正确的文件。我还修改了下面文件中的 Content-Type 标头。

import os
import urllib2
class EnhancedFile(file):
    def __init__(self, *args, **keyws):
        file.__init__(self, *args, **keyws)

    def __len__(self):
        return int(os.fstat(self.fileno())[6])

theFile = EnhancedFile('a.xml', 'r')
theUrl = "http://example.com/abcde"
theHeaders= {'Content-Type': 'text/xml'}

theRequest = urllib2.Request(theUrl, theFile, theHeaders)

response = urllib2.urlopen(theRequest)

theFile.close()


for line in response:
    print line

【讨论】:

    猜你喜欢
    • 2012-12-16
    • 1970-01-01
    • 1970-01-01
    • 2012-07-30
    • 2020-10-10
    • 1970-01-01
    • 1970-01-01
    • 2013-04-27
    • 2012-05-27
    相关资源
    最近更新 更多