Python Rest клиент API для загрузки файла - PullRequest
0 голосов
/ 24 октября 2018

Я использую Python 2.7.Мой серверный API-интерфейс Rest работает нормально, и я могу загрузить ZIP-файл с помощью Postman.Я пытаюсь загрузить ZIP-файл с помощью API-интерфейса Rest client.Я попробовал пакет запросов, но он не может отправить файлы.Я получаю сообщение об ошибке: отсутствует аргумент файла.

Это мой код на стороне python-сервера:

@ns.route('/upload_file', strict_slashes=False)
class Upload(Resource):
    @api.expect(upload_parser)
    def post(self):

        args = upload_parser.parse_args()
        file_nameup = args.file.filename 

Вот код оставшегося API клиента:

import requests
from requests.auth import HTTPBasicAuth
import json

headers={'Username': 'abc@gmail.com', 'apikey':'123-e01b', 'Content-Type':'application/zip'}
f = open('C:/Users/ADMIN/Downloads/abc.zip', 'rb')

files = {"file": f}

resp = requests.post("https://.../analytics/upload_file", files=files, headers=headers )

print resp.text   

print "status code " + str(resp.status_code)

if resp.status_code == 200:
    print ("Success")
    print resp.json()
else:
    print ("Failure")

Это моя ошибка: {"message":«Ошибка проверки входных данных», «error»: {«file»: «Отсутствует обязательный параметр в загруженном файле»} код состояния 400 Failure

В почтальоне я передал zip-файл с текстом «file»"как ключ и значение как файл abc.zip.Работало нормально.Я пытался использовать библиотеку httplib, но она не удалась, так как мой почтовый URL не содержит номера порта.Это ошибка с httplib:

python HttpClientEx.py Traceback (последний вызов был последним): файл "HttpClientEx.py", строка 4, в файле h = http.client.HTTPConnection (url) "c: \ python27 \ Lib \ httplib.py ", строка 736, в init (self.host, self.port) = self._get_hostport (host, port) Файл" c: \ python27 \ Lib \httplib.py ", строка 777, в _get_hostport повысить InvalidURL (" нечисловой порт: '% s' "% host [i + 1:]) httplib.InvalidURL: нечисловой порт: '// .... net / analytics / upload_file'

Как вызвать пост остальных URL и загрузить файл с помощью библиотеки urllib.Пожалуйста, предложите любые другие способы загрузки файла в остальных клиентах.Благодарю.

Я нашел еще один повторяющийся пост:

Запросы Python - отправка zip-файла с multipart / form-data

Упомянутое там решение не сработало,Я обнаружил, что вам нужно указать полный путь к файлу, иначе он не будет работать.

Ответы [ 2 ]

0 голосов
/ 25 октября 2018
Библиотека

запросов работала со следующими изменениями в моем коде:

import requests
from requests.auth import HTTPBasicAuth
import json
from pathlib import Path

file_ids = ''
headers={'Username': 'abc@gmail.com', 'apikey':'123-456'}
# Upload file

f = open('C:/Users/ADMIN/Downloads/abc.zip', 'rb')

files = {"file": ("C:/Users/ADMIN/Downloads/abc.zip", f)}

resp = requests.post("https:// ../analytics/upload_file", files=files, headers=headers )
print resp.text
print "status code " + str(resp.status_code)

if resp.status_code == 201:
    print ("Success")
    data = json.loads(resp.text)
    file_ids = data['file_ids']
    print file_ids
else:
    print ("Failure")
0 голосов
/ 24 октября 2018

Использовать модуль urllib3.

https://urllib3.readthedocs.io/en/latest/user-guide.html

Файлы и двоичные данные

Для загрузки файлов с использованием кодирования данных multipart / form вы можете использовать тот же подход, что и данные формыи укажите поле файла как кортеж (имя_файла, данные_файла):

with open('example.txt') as fp:
    file_data = fp.read()
r = http.request(
    'POST',
    'http://httpbin.org/post',
    fields={ 
        'filefield': ('example.txt', file_data),
    })

json.loads(r.data.decode('utf-8'))['files']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...