How to specify python requests http put body?

PythonHttpPutHttplib2Python Requests

Python Problem Overview


I'm trying to rewrite some old python code with requests module. The purpose is to upload an attachment. The mail server requires the following specification :

https://api.elasticemail.com/attachments/upload?username=yourusername&api_key=yourapikey&file=yourfilename

Old code which works:

h = httplib2.Http()        
        resp, content = h.request('https://api.elasticemail.com/attachments/upload?username=omer&api_key=b01ad0ce&file=tmp.txt', 
        "PUT", body=file(filepath).read(), 
        headers={'content-type':'text/plain'} )

Didn't find how to use the body part in requests.

I managed to do the following:

 response = requests.put('https://api.elasticemail.com/attachments/upload',
                    data={"file":filepath},                         
                     auth=('omer', 'b01ad0ce')                  
                     )

But have no idea how to specify the body part with the content of the file.

Thanks for your help. Omer.

Python Solutions


Solution 1 - Python

Quoting from the docs

> data – (optional) Dictionary or bytes to send in the body of the Request.

So this should work (not tested):

 filepath = 'yourfilename.txt'
 with open(filepath) as fh:
     mydata = fh.read()
     response = requests.put('https://api.elasticemail.com/attachments/upload',
                data=mydata,                         
                auth=('omer', 'b01ad0ce'),
                headers={'content-type':'text/plain'},
                params={'file': filepath}
                 )

Solution 2 - Python

I got this thing worked using Python and it's request module. With this we can provide a file content as page input value. See code below,

import json
import requests

url = 'https://Client.atlassian.net/wiki/rest/api/content/87440'
headers = {'Content-Type': "application/json", 'Accept': "application/json"}
f = open("file.html", "r")
html = f.read()

data={}
data['id'] = "87440"
data['type']="page"
data['title']="Data Page"
data['space']={"key":"AB"}
data['body'] = {"storage":{"representation":"storage"}}
data['version']={"number":4}

print(data)

data['body']['storage']['value'] = html

print(data)

res = requests.put(url, json=data, headers=headers, auth=('Username', 'Password'))

print(res.status_code)
print(res.raise_for_status())

Feel free to ask if you have got any doubt.


NB: In this case the body of the request is being passed to the json kwarg.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionomer bachView Question on Stackoverflow
Solution 1 - PythonrabenView Answer on Stackoverflow
Solution 2 - PythonAshfaqView Answer on Stackoverflow