65

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.

omer bach
  • 2,345
  • 5
  • 30
  • 46

2 Answers2

95

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}
                 )
tedder42
  • 23,519
  • 13
  • 86
  • 102
raben
  • 3,060
  • 5
  • 32
  • 34
19

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.

Little Bobby Tables
  • 4,466
  • 4
  • 29
  • 46
Ashfaq
  • 1,137
  • 1
  • 12
  • 22
  • 2
    This helped but a couple points: 1) you need to pass `headers=headers`. 2) you should elaborate on the fact that the `json` kwarg is the body in this case. 3) You are mixing python 2 and 3 in your print statements!! :) – Little Bobby Tables Oct 16 '18 at 16:17