I am trying to sent a curl command to a webserver to control a device in my home. The webserver contains the following JSON data:
{"result":1, "error":null, "id":0, "data":{"vid":2, "did":4, "device_type":"airconditioner", "default_name":"Air Conditioner Settings", "tags":"aircon", "is_sensor":1, "is_actuator":1, "is_silent":0, "has_time_series":0, "has_subdevice_count":0, "has_state":0, "gid":"0", "guid":"xxxx", "node":"yyy", "meta":{}, "shortName":"", "subDevices":{}, "last_data":{"DA":{"amOn":false, "tempTarget":22, "mode":1, "fanSpeed":0, "enabledZones":[1,1,0,0,0,0,0,0]}, "timestamp":1500523622862}}
Using curl I can send the following PUT command to turn the device on:
curl -v -H "Accept: application/json" -H "Content-Type: application/json" -X PUT -d '{"DA":{"amOn":"true"}}' https://actron.ninja.is/rest/v0/device/xxxx?user_access_token=zzzz
However I am stuck in sending a PUT command to change the numbers in the enabledZones array.
I have tried many variations of the command below with no success:
curl -v -H "Accept: application/json" -H "Content-Type: application/json" -X PUT -d '{"DA":{"enabledZones[1]":"0"}}' https://actron.ninja.is/rest/v0/device/xxxx?user_access_token=zzzz
Any suggestions will be very much appreciated
I think you are sending incorrect array request in json. To update array element 1 with 0, you need to use "enabledZones":[1,0,0,0,0,0,0,0].
Please see if below CURL command works
curl -v -H "Accept: application/json" -H "Content-Type: application/json" -X PUT -d '{"DA":{"enabledZones":[1,0,0,0,0,0,0,0]}}' https://actron.ninja.is/rest/v0/device/xxxx?user_access_token=zzzz
Related
I am trying to use the curl command from a batch script.
curl -k -o "C:\Temp\**8.txt" -X POST -H "auth-key: 1****G-*****" -H "Content-Type:application/json" --data-binary #"***\test.txt" https://localhost:9443/security/backend-connectivity
I am seeing an error:
HTTPError: (415, 'Expected an entity of content type application/json, text/javascript')
My JSON file is good.
Any input would be appreciated.
I am trying to query via CURL command line but I believe I need to encode it.
Example:
curl -X GET -H "Authorization:c02c66a4531a43c5a0971d16c2823e1a" 'http://127.0.0.1:8050/api/core/query?sql=select n return n limit 10' -i
I don't ever see why this is a good idea, but here is a curl with an encoded match(n) return n limit 10' -i:
curl -X GET \
http://127.0.0.1:8085/api/core/query \
-H 'Authorization: c02c66a4531a43c5a0971d16c2823e1a' \
-H 'Content-Type: application/x-www-form-urlencoded' \
-d 'sql=match(n)%20return%20n%20limit%2010'\''%20-i'
I need to pass in Okta data to my application:
url: "www.okta.com"
groups: ["g1", "g2"]
Now, how do I structure curl request to send an array?
curl --digest --user abc -H 'Content-Type: application/json' --request POST -d ' {"url":"www.okta.com", "groups": **????** }' url
The data payload is just JSON? Wouldn't you simply include the array as an element of the data object?
curl --digest --user abc -H 'Content-Type: application/json' --request POST -d ' {"url":"www.okta.com", "groups": ["g1", "g2"]}' url
I have a device Stiebel Eltron heat pump home and I would like to use Linux shell curl (not php) curl to login (POST) and retrieve (GET) data once logged
Here is how my curl login POST call looks like (I used Firebug + persist option to copy/paste the below):
curl --data-urlencode 'userName=tutu&password=xx' \
'https://thesite/api/login?noCacheDummyValue=1459356436185' -X POST \
-H 'Host: thesite' \
-H 'User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0' \
-H 'Accept: application/json, text/plain, */*' \
-H 'Accept-Language: en-US,en;q=0.7,fr-FR;q=0.3' \
-H 'Accept-Encoding: gzip, deflate, br' \
-H 'X-Requested-With: XMLHttpRequest' \
-H 'Content-Type: application/json;charset=utf-8' \
-H 'Referer: https://thesite/mobile/app/app.html' \
-H 'Content-Length: 44' \
-H 'Cookie: JSESSIONID=qhs02mfeip2p1n5n4t2rj1huu'
But this gives me nothing in the output:
sh myproj.sh
curl: (52) Empty reply from server
Q1: What should I collect from this first POST, and how to do it?
I tried to get the cookie with --cookie-jar cookie.txt but nothing showed up in my current directory. However I sent cookies with the header... shouldn't I get them back?
After that I would like to continue the session I (think I) opened so to collect data from a GET that is (same method as above):
curl 'https://thesite/api/data/1036493/heatEnergy/today?noCacheDummyValue=1459356438440' \
-H 'Host: thesite' \
-H 'User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0' \
-H 'Accept: application/json, text/plain, */*' \
-H 'Accept-Language: en-US,en;q=0.7,fr-FR;q=0.3' \
-H 'Accept-Encoding: gzip, deflate, br' \
-H 'X-Requested-With: XMLHttpRequest' \
-H 'Referer: https://thesite/mobile/dashboard/dash.html' \
-H 'Cookie: JSESSIONID=qhs02mfeip2p1n5n4t2rj1huu'
Q2: How do I keep the session opened to perform the GETabove?
I tried --next option idea from here to call the GET after the POST; without success, --next option is not recognized on my Ubuntu Linux.
If it can help understanding, the page I should get is full of javascript (angularjs I think).
From your POST call it is obvious that you are trying to do an ajax XMLHttpRequest. Likely this is expecting json encoded data. However you are providing url-encoded data.
Probably you should try using something along
... -X POST -H "Content-Type: application/json" -d '{"userName":"tutu","password":"xx"}' 'https://thesite/api/login?noCacheDummyValue=1459356436185'
To make the login work, you need to match the way the server is maintaining the session. If session info is referred to via a cookie yo may just extract the cookie from the POST call (as you said you tried already, but on an error related response)
If the server does not use a straight way of referencing the session you might not succeed in getting your GET call working. If you are lucky maybe you then just need to parse a string from the page (fragment) or json data returned.
So monitor what a working handshake (e.g using a browser) is exchanging over the wire. And try identifing the important pieces of data. Then, put those together to form your GET call.
Thanks to rpy, I was able to do what I wanted:
Collect the session cookie:
curl -a -X POST -d '{"userName":"tutu","password":"xx"}' \
--trace-ascii debugdump.txt --cookie-jar cookies.txt \
-H 'Content-Type: application/json;charset=utf-8' \
-H 'Referer: https://thesite/mobile/app/app.html' \
'https://thesite/api/login?noCacheDummyValue=1459356436185' -o my.post
todo: check result is "ok" in my.post
todo: get content of cookies.txt into ${COOKIE}
Use it to retrieve the raw data I wanted:
curl -a \
-H 'Referer: https://thesite/mobile/dashboard/dash.html' \
-H 'Cookie:JSESSIONID='${COOKIE} \
'https://thesite/api/data/1036493/outTemp/lastMonth?noCacheDummyValue=1459972646687' \
-o lm_outTemp.get \
-L 'https://thesite/api/data/1036493/heatEnergy/lastMonth?noCacheDummyValue=1459972646694' \
-o lm_heatEnergy.get
And I already started working on how to process the data here: Firefox - Collecting the data used by LAB.min.js
I know how to post data from a local file with curl :
curl -i -X POST -H 'Content-Type: text/plain' -d #foo.txt http://bar.com/foobar
But I would like to do the same, but from a distant file, for example :
curl -i -X POST -H 'Content-Type: text/plain' -d #http://www.google.fr/robots.txt http://bar.com/foobar
If I try this command, I have warnings : Couldn't read data from file, this makes an empty POST.
Is is possible to do that?
I suppose that my answer is not new for you, but why you can't do this:
curl http://www.google.fr/robots.txt > /tmp/foo.txt
curl -i -X POST -H 'Content-Type: text/plain' -d #/tmp/foo.txt http://bar.com/foobar