Sending data Curl/Json in Python

前端 未结 4 1611
遥遥无期
遥遥无期 2021-01-13 06:13

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

Request 1:

 curl -X POST -H \"Content-Type: application/json\" -d \'{ \"auth_token\": \"auth1\", \"w         


        
相关标签:
4条回答
  • 2021-01-13 06:41

    why not use urllib2?

    import urllib2
    import urllib
    
    vsphere_dict = dict(
        server_name="servername",
        api_version=apiVersion,
        guest_count=guestCount,
        guest_on=guestOnLen,
        guest_off=guestOffLen,
    )
    # create request object, set url and post data
    req = urllib2.Request(some_url, data=urllib.urlencode(vsphere_dict))
    # set header
    req.add_header('Content-Type', 'application/json')
    # send request
    response = urllib2.urlopen(req)
    

    UPD:

    sorry, by i not understand that is auth and widget. Maybe this is also POST data? HTTP Error 500 - can mean that server received not all POST parameters.

    0 讨论(0)
  • 2021-01-13 06:46

    In the example from the Dashing website, they use:

    curl -d '{ "auth_token": "YOUR_AUTH_TOKEN", "current": 100 }' http://localhost:3030/widgets/karma
    

    From the cURL man page, maybe you need to post it as form-urlencoded?

    -d, --data

    (HTTP) Sends the specified data in a POST request to the HTTP server, in the same way that a browser does when a user has filled in an HTML form and presses the submit button. This will cause curl to pass the data to the server using the content-type application/x-www-form-urlencoded. Compare to -F, --form.

    -d, --data is the same as --data-ascii. To post data purely binary, you should instead use the --data-binary option. To URL-encode the value of a form field you may use --data-urlencode.

    If any of these options is used more than once on the same command line, the data pieces specified will be merged together with a separating &-symbol. Thus, using '-d name=daniel -d skill=lousy' would generate a post chunk that looks like 'name=daniel&skill=lousy'.

    If you start the data with the letter @, the rest should be a file name to read the data from, or - if you want curl to read the data from stdin. Multiple files can also be specified. Posting data from a file named 'foobar' would thus be done with --data @foobar. When --data is told to read from a file like that, carriage returns and newlines will be stripped out.

    You might also want to try python-requests http://requests.readthedocs.org/en/latest/user/quickstart/#more-complicated-post-requests

    Update: I got it to work

    import requests
    import json
    
    payload = {'auth_token': 'YOUR_AUTH_TOKEN', 'title': "pythontest"}
    r = requests.post("http://localhost:3030/widgets/welcome", data=json.dumps(payload))
    
    print r.text
    

    You need to post the json like a form.

    0 讨论(0)
  • 2021-01-13 06:54

    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.

    0 讨论(0)
  • 2021-01-13 07:03

    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.

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