Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sending data Curl/Json in Python

Tags:

python

dashing

I`m trying to make those 2 requests in python:

Request 1:

 curl -X POST -H "Content-Type: application/json" -d '{ "auth_token": "auth1", "widget":   "id1", "title": "Something1",  "text": "Some text", "moreinfo": "Subtitle" }'   serverip

Request 2:

 vsphere_dict = {}
 vsphere_dict['server_name'] = "servername"
 vsphere_dict['api_version'] = apiVersion
 vsphere_dict['guest_count'] = guestCount
 vsphere_dict['guest_on']    = guestOnLen
 vsphere_dict['guest_off']   = guestOffLen

 #Convert output to Json to be sent
 data = json.dumps(vsphere_dict)

 curl -X POST -H "Content-Type: application/json" -d 'data' serverip

Neither of them seems to work. Is there any way I can send them in Python?

Update:

The part that I cannot handle is the pass auth and widget. I have tried the following without success:

import urllib2
import urllib

vsphere_dict = dict(
    server_name="servername",
    api_version="apiVersion",
    guest_count="guestCount",
    guest_on="guestOnLen",
    guest_off="guestOffLen",
)

url = "http://ip:port"

auth = "authid89"
widget = "widgetid1"

# create request object, set url and post data
req = urllib2.Request(auth,url, data=urllib.urlencode(vsphere_dict))
# set header
req.add_header('Content-Type', 'application/json')
# send request
response = urllib2.urlopen(req)**

Resulting in "urllib2.HTTPError: HTTP Error 500: Internal Server Error"

Any ideas how I can pass the auth and widget correctly?

UPDATE:

To see what is different I have started a nc server locally. Here are the results:

Correct curl request using this code:

 curl -X POST -H "Content-Type: application/json" -d '{ "auth_token": "auth", "widget": "widgetid", "title": "Something", "text": "Some text", "moreinfo": "Subtitle" }' http://localhost:8123

sends this which does work:

 POST / HTTP/1.1
 User-Agent: curl/7.21.0 (i386-redhat-linux-gnu) libcurl/7.21.0 NSS/3.12.10.0 zlib/1.2.5  libidn/1.18 libssh2/1.2.4
 Host: localhst:8123
 Accept: */*
 Content-Type: application/json
 Content-Length: 165

 { "auth_token": "token", "widget": "widgetid", "title": "Something", "text": "Some text", "moreinfo": "Subtitle" }

And request using this code

  import requests
  import simplejson as json

  url = "http://localhost:8123"
  data = {'auth_token': 'auth1', 'widget': 'id1', 'title': 'Something1', 'text': 'Some   text', 'moreinfo': 'Subtitle'}
  headers = {'Content-type': 'application/json'}
  r = requests.post(url, data=json.dumps(data), headers=headers)

sends this which does not work:

 POST / HTTP/1.1
 Host: localhst:8123
 Content-Length: 108
 Content-type: application/json
 Accept-Encoding: gzip, deflate, compress
 Accept: */*
 User-Agent: python-requests/2.0.1 CPython/2.7.0 Linux/2.6.35.14-106.fc14.i686

 {"text": "Some text", "auth_token": "auth1", "moreinfo": "Subtitle", "widget": "id1",  "title": "Something1"}
like image 532
Spanglish Avatar asked Nov 26 '13 08:11

Spanglish


2 Answers

Requests provides you with the simplest and yet (very) powerful way to deal with HTTP requests in Python.

Maybe try something like this:

import requests
import simplejson as json

url = "http://ip:port"
data = {'auth_token': 'auth1', 'widget': 'id1', 'title': 'Something1', 'text': 'Some text', 'moreinfo': 'Subtitle'}
headers = {'Content-type': 'application/json'}
r = requests.post(url, data=json.dumps(data), headers=headers)

If the API requests authentication:

r = requests.post(url, data=json.dumps(data), headers=headers, auth=('user', 'pass'))

See [Requests auth] for details.

like image 168
Nicola Iarocci Avatar answered Oct 04 '22 20:10

Nicola Iarocci


Well sure, using Python-Requests which is a Python library for sending requests like Curl. You can take a look at the Complicated Post Requests section.

Or, if you'd like to use curl inside of Python, you can use pyCurl.

like image 44
Games Brainiac Avatar answered Oct 04 '22 20:10

Games Brainiac