POST-файл в теле запроса к API - PullRequest
0 голосов
/ 13 июня 2019

Я пытаюсь загрузить файл в API, который просто говорит:

REQUEST Тело запроса должно содержать содержимое файла.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.(Файл не был загружен)

Есть ли другие способы добавить файл в тело запроса, или я здесь что-то не так делаю?

Спасибо за любую помощь.

Ответы [ 2 ]

0 голосов
/ 17 июня 2019

Я наконец-то заработал, основываясь на ответе меня. Это сделало трюк:

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)
0 голосов
/ 13 июня 2019

В моем случае я смог загрузить файл из запроса на поставку следующим образом:

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}
    )
...