Using Python Requests to send file and JSON in single request

前端 未结 2 401
醉酒成梦
醉酒成梦 2020-12-30 06:30

I\'m trying to POST to an API (Build using SlimPHP) which accepts an image along with additional image meta data in the form of JSON.

I\'ve verified the API works

相关标签:
2条回答
  • 2020-12-30 07:12

    Your problem is that you are using the image metadata as the source of key/value pairs to be posted. Instead of sending it as the value of one of those key/value pairs.

    The following code will send a request much like the curl statement you provided:

    url = 'my-url.com/api/endpoint'
    headers = {'Authorization': 'my-api-key'}
    image_metadata = {'key1': 'value1', 'key2': 'value2'}
    data = {'name': 'image.jpg', 'data': json.dumps(image_metadata)}
    files = {'file': (FILE, open(PATH, 'rb'), 'image/jpg', {'Expires': '0'})}
    r = requests.post(url, files=files, headers=headers, data=data)
    
    0 讨论(0)
  • 2020-12-30 07:21

    If you need to post nested JSON data and send files in single request, you need to use json.dumps for these elements (lists and mappings in the example below)

    import requests
    
    session = requests.Session()
    session.post(login_url, json=your_credentials_dict)  # auth , not required
    mapping = {"email": "Email", "First Name": "first_name"}
    post_data = dict(
       mode=1,
       lists=json.dumps(["133", "899", "911"]),
       mapping=json.dumps(mapping),
    )
    files_data = {'file': ('your-file-name.csv', file_bytes_content)}
    response = session.post(<your-url>, data=post_data, files=files_data)
    

    And as a result will be sent request like this:

    ********** post file data with mapping **********
     --> REQUEST: POST /v3/contacts/import/file/ HTTP/1.1
     --> REQUEST: Host: <your-host>:4000
     --> REQUEST: User-Agent: python-requests/2.23.0
     --> REQUEST: Accept-Encoding: gzip, deflate
     --> REQUEST: Accept: */*
     --> REQUEST: Connection: keep-alive
     --> REQUEST: Cookie: jwt=eyJ0e***
     --> REQUEST: Content-Length: 654
     --> REQUEST: Content-Type: multipart/form-data; boundary=db850c3230988e010b1ebe21be3fb344
     --> REQUEST: 
     --> REQUEST: --db850c3230988e010b1ebe21be3fb344
    Content-Disposition: form-data; name="lists"
    
    ["7syewz9qUz0CbaqhaGm", "LBfWKJwq4Q"]
    --db850c3230988e010b1ebe21be3fb344
    Content-Disposition: form-data; name="mode"
    
    2
    --db850c3230988e010b1ebe21be3fb344
    Content-Disposition: form-data; name="mapping"
    
    {"email": "Email", "First Name": "first_name"}
    --db850c3230988e010b1ebe21be3fb344
    Content-Disposition: form-data; name="file"; filename="good.csv"
    
    first_name;last_name;email;age
    John;Doe;test.testson_1@test.com;50
    Mark;Twen;test.testson_2@test.com;20
    
    --db850c3230988e010b1ebe21be3fb344--
    

    requests-toolbelt package was used to generate the log above https://pypi.org/project/requests-toolbelt/

    0 讨论(0)
提交回复
热议问题