Python запрашивает публиковать файл, публиковать файл и данные одновременно - PullRequest
0 голосов
/ 28 сентября 2018

Я очень плохо знаком с python (и программирую в целом), поэтому надеюсь, что я достаточно четко сформулирую свои проблемы.Мне удалось собрать воедино приложение, которое подключается к API одного из программ моей компании.

Я смог авторизоваться, получить токен, передать его другим функциям в GET и POST для некоторыхAPI функции.Я работаю над новым вызовом API, который публикует файл.Я в замешательстве.Все примеры, которые я нахожу, показывают только передачу файла, но мне нужно передать файл, данные и заголовок аутентификации.Я пробовал так много вариантов моего кода, и ничто не приблизило меня.

Во-первых, эта функция работает, но с другим API (группами) для публикации новой группы.Он не включает в себя никаких файлов.

def apiPost(token):
if not token == "":
    status.run_set_text('Running API POST Call', 3)
    headers = { 'Content-Type':'application/json', 'Authorization':'Bearer '+str(token) }
    data = {"data":{ 'id':0, 'customerId':33, 'name':'567tuhj', 'description':'sdfgsdfg'}}
    r = requests.post(api_url+"v1.1/groups/", headers=headers, data=json.dumps(data))
    ***other code removed updating status bars***
    return r
else:
    ***other code removed updating status bars***

Моя среда разработки имеет доступ только к одному клиенту, но все же требует, чтобы я опубликовал customerId в POST.

Я пробовал сотни вариантов преобразования этого в публикацию файла из того, что я прочитал в учебниках по сайтам запросов и некоторых других вопросов, связанных со стековым потоком.Это сообщения в API packageFiles.На странице Swagger, к которой у меня есть доступ, написано, что при загрузке файла необходимо указать идентификатор и идентификатор клиента.

def apiPost(token):
if not token == "":
    status.run_set_text('Running API POST Call', 3)
    headers = {'Authorization':'Bearer '+str(token)}
    files = {'file': open('log.txt', 'rb')}
    data = {"data":{ 'id':0, 'customerId':33}}
    r = requests.post(api_url+"v1.1/package_files/"+set_api_pair_value, headers=headers, data=json.dumps(data), file=files)
    ***other code removed updating status bars***
    return r
else:
     ***other code removed updating status bars***

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

Комментарий : Я получаю 400 (неверный запрос) с этим принятым ответом ..

{"status":"FAILURE",
  "error":[{"code":"5004",
  "name":"General Error","severity":"3","message":"Error Occurred During the operation",
  "details":{"5004":"General Error null"}}]} 
{'Connection': 'keep-alive', 'X-Powered-By': 'Undertow/1', 'Server': 'WildFly/9', 'Content-Length': '172', 'Content-Type': 'application/json;charset=UTF-8', 'X-Application-Context': 'application:9090', 'Date': 'Fri, 28 Sep 2018 17:57:57 GMT'}

Пожалуйста, отредактируйте свой вопрос и добавьтеваш Python и requests версия!

Попробовал следующее, используя текстовый файл вместо изображения:

import requests

url = 'http://httpbin.org/anything'
files = {'file': ('helloworld.txt', open('../test/helloworld.txt', 'rb'), 'text/text')}
data = dict(name='barca', country='spain')
r = requests.post(url, files=files, data=data)

# Print my requests.post header, files and data.
r_dict = r.json()
for key in r_dict:
    print('{}:{}'.format(key, r_dict[key]))

Ответ от http://httpbin.org/anything:

<Response [200]>

Мой requests.post заголовок, файлы и данные, отправка обратно с хоста.

method:POST
files:{'file': 'Hello World'}
url:http://httpbin.org/anything
form:{'name': 'barca', 'country': 'spain'}
origin:xx.xx.xx.xx
args:{}
headers:{'Content-Length': '369', 
         'Accept': '*/*', 
         'Content-Type': 'multipart/form-data; boundary=bc3c1927f542430f8166e8f3f27f3c72', 
         'Host': 'httpbin.org', 'Connection': 'close', 
         'User-Agent': 'python-requests/2.11.1', 
         'Accept-Encoding': 'gzip, deflate'}
json:None
data:

Протестировано с Python: 3.4.2 - запросы: 2.11.1

0 голосов
/ 28 сентября 2018

Во-первых, вы должны отформатировать свой код, чтобы он был чистым, красивым и читабельным

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

def apiPost(token):
    if not token == "":
       status.run_set_text('Running API POST Call', 3)
       headers = { 'Content-Type':'application/json',
                   'Authorization':'Bearer '+str(token) }

       data = {"data":
                  { 'id':0,
                    'customerId':33,
                    'name':'567tuhj',
                    'description':'sdfgsdfg'
                  }
              }

       #The part you are looking for probably
       files = {'name_of_file_field' : open("rb", file)}

       r = requests.post(api_url+"v1.1/groups/", headers=headers, data=json.dumps(data), files = files)
       ***other code removed updating status bars***
       return r
    else:
       ***other code removed updating status bars***
...