将请求正文中的 POST 文件发布到 API



我正在尝试在API中上传一个文件,该文件仅显示:

请求 请求正文应包含文件的内容。 https://developer.fortnox.se/documentation/resources/inbox/

到目前为止我尝试过:

headers = {
"Access-Token": settings.FORTNOX_ACCESS_TOKEN,
"Client-Secret": settings.FORTNOX_CLIENT_SECRET,
"Content-Type": "multipart/form-data",
"Accept": "application/json",
}
file = open(invoice.file.path, 'rb').read()
r = requests.post("https://api.fortnox.se/3/inbox", data=file, headers=headers)

这给了我一个错误:

Ingen fil var uppladdad.(未上传任何文件)

headers = {
"Access-Token": settings.FORTNOX_ACCESS_TOKEN,
"Client-Secret": settings.FORTNOX_CLIENT_SECRET,
"Content-Type": "multipart/form-data",
"Accept": "application/json",
}
h = httplib2.Http()
file = open(invoice.file.path, 'rb').read()
resp, content = h.request('https://api.fortnox.se/3/inbox', "POST", body=file, headers=headers)

这给了我同样的错误:

Ingen fil var uppladdad.(未上传任何文件)

是否有其他方法可以将文件添加到请求正文,还是我在这里做错了什么?

感谢您的任何帮助。

根据我的回答,我终于让它工作了。这起到了作用:

multipart_data = MultipartEncoder(
fields={
'file': (invoice.file.path, open(invoice.file.path, 'rb'), 'text/plain')
}
)
headers = {
"Access-Token": settings.FORTNOX_ACCESS_TOKEN,
"Client-Secret": settings.FORTNOX_CLIENT_SECRET,
"Content-Type": multipart_data.content_type,
"Accept": "application/json",
}
r = requests.post("https://api.fortnox.se/3/inbox", headers=headers, data=multipart_data)

就我而言,我能够像这样从放置请求上传文件:

import requests
from requests_toolbelt.multipart.encoder import MultipartEncoder
def upload_localfile(filepath,server_data):
multipart_data = MultipartEncoder(
fields={
'file': (filepath, open(filepath, 'rb'), 'text/plain')
}
)
response=requests.put(
server_data, 
data=multipart_data,
headers={'Content-Type': multipart_data.content_type}
)

你应该在 fortnox 中使用这个实现:

files = [
('file', ('somename.pdf', data.file -> NamedTemporaryFile in my case))
]
response = requests.post(
url,
headers={"Authorization": f"Bearer {token}",}
data={},
files=files,
)

最新更新