python请求发布文件,同时发布文件和数据

时间:2018-09-28 17:19:08

标签: python api post python-requests

我对python(和一般的编码)非常陌生,所以我希望我能很好地阐明我的问题。我设法将一个连接到我公司软件之一的API的应用程序拼凑在一起。

我已经能够进行身份验证,获取令牌,将其传递给其他函数以进行GET和POST传递给某些API函数。我正在处理一个发布文件的新API调用。我被困了。我发现的所有示例仅显示传递文件,但我需要传递文件,数据和auth标头。我已经尝试了很多代码变体,但是没有什么比这更接近我了。

首先,此功能有效,但具有用于发布新群组的不同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。

我已经尝试了数百种将其转换为发布文件的变体,这些内容来自我在请求站点教程和其他一些stackoverflow问题上所阅读的内容。这将发布到API packageFiles。根据我所访问的Swagger页面,它说,在仍上传文件时,我需要包括ID和客户ID。

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 :(得分:0)

首先,您应该将代码格式化为整洁,美观和可读

我正在尝试解决您的问题,但是我认为您应该在问题上附加一些预期的数据,文件,请求参数。

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***

答案 1 :(得分:0)

  

评论:我返回了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