omer bach
omer bach

Reputation: 2395

How to specify python requests http put body?

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.

Upvotes: 69

Views: 219761

Answers (2)

raben
raben

Reputation: 3100

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}
                 )

Upvotes: 97

Ashfaq
Ashfaq

Reputation: 1259

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.

Upvotes: 21

Related Questions