简体   繁体   中英

Curl command in Windows

I'm learning feathersjs as per below link

http://feathersjs.com/quick-start/

I need to run below command and monitor the output at http://localhost:3000/todo

curl 'http://localhost:3000/todos/' -H 'Content-Type: application/json' --data-binary '{ "text": "Do something" }'

When I tried to run below on cmd, it shows 'curl' is not recognized in cmd prompt.

If I tried to run it using git-bash.exe, bash.exe or sh.exe (in Git/bin or shell.w32-ix86), Cygwin.bat (in cygwin64), it will run fine and showing result in browser.

[{"text":"Do something","id":0}]

But if tried to run it by including into my PATH "C:\\Program Files\\Git\\mingw64\\bin, which has curl.exe", I will be getting below error, but "C:\\Program Files\\Git\\usr\\bin" will do just fine...

curl: (1) Protocol "'http" not supported or disabled in libcurl
curl: (6) Couldn't resolve host 'application'
curl: (6) Couldn't resolve host text'
curl: (6) Couldn't resolve host 'Do something'
curl: (3) [globbing] unmatched close brace/bracket in column 1

I managed to remove the error with below command

curl "http://localhost:3000/todos/" -H "Content-Type: 'application/json'" --data-binary "{ 'text': 'Do something' }"

But the resulting output will have the Json object "text" missing...

[{"text":"Do something","id":0},{"id":1}]

Question:
1) After modifying the command, the Json object is not parsed successfully. Is there a syntax problem?
2) If there is no syntax problem, does this means that curl need to be run in Unix environment as per original attempt, that it cant be run in cmd directly, but will function ok in bash, cygwin, etc2?
3) What is the difference between curl.exe in C:\\Program Files\\Git\\usr\\bin and C:\\Program Files\\Git\\mingw64\\bin, which has curl.exe?

Update:

Not OK Raw Cap output http.content_type == "'application/json'"

OK Raw Cap output http.content_type == "application/json"

Update2:

Removing single quote in application/json on the 2nd command... shows error

C:\Users\testUser>"C:\Program Files\Git\mingw64\bin\curl.exe" "http://localhost:3000/todos/" -H "Content-Type: 'application/json'" --data-binary "{ 'text': 'Do something' }"
{"id":1}
C:\Users\testUser>"C:\Program Files\Git\mingw64\bin\curl.exe" "http://localhost:3000/todos/" -H "Content-Type: application/json" --data-binary "{ 'text': 'Do something' }"
SyntaxError: Unexpected token &#39;<br> &nbsp; &nbsp;at Object.parse (native)<br> &nbsp; &nbsp;at parse (C:\Users\testUser\Documents\Framework\Javascript\featherstestNewService\node_modules\body-parser\lib\types\json.js:88:17)<br> &nbsp; &nbsp;at C:\Users\testUser\Documents\Framework\Javascript\featherstestNewService\node_modules\body-parser\lib\read.js:116:18<br> &nbsp; &nbsp;at invokeCallback (C:\Users\testUser\Documents\Framework\Javascript\featherstestNewService\node_modules\body-parser\node_modules\raw-body\index.js:262:16)<br> &nbsp; &nbsp;at done (C:\Users\testUser\Documents\Framework\Javascript\featherstestNewService\node_modules\body-parser\node_modules\raw-body\index.js:251:7)<br> &nbsp; &nbsp;at IncomingMessage.onEnd (C:\Users\testUser\Documents\Framework\Javascript\featherstestNewService\node_modules\body-parser\node_modules\raw-body\index.js:308:7)<br> &nbsp; &nbsp;at emitNone (events.js:67:13)<br> &nbsp; &nbsp;at IncomingMessage.emit (events.js:166:7)<br> &nbsp; &nbsp;at endReadableNT (_stream_readable.js:905:12)<br> &nbsp; &nbsp;at doNTCallback2 (node.js:441:9)

Update 3:

Tried to replace libcurl-4.dll used by curl.exe. Downloaded libcurl from " http://curl.haxx.se/download.html ", MingW32 from " http://sourceforge.net/projects/mingw/files/MSYS/ " and added "C:\\MinGW\\bin" to PATH. Then grep -rl "libcurl.dll" . | xargs sed -i 's/libcurl.dll/libcurl-4.dll/g' to create libcurl-4.dll as per suggested " http://curl.haxx.se/mail/lib-2010-11/0174.html ". Then execute ./buildconfig, make, make install. Then copied the libcurl-4.dll to C:\\Program Files\\Git\\mingw64\\bin folder, but the result is the same...

Update 4

Changing origin of curl.exe but still using same command, shows error on the mingw64 version. I'm suspecting that mingw64 curl need special escaping to make it work?

C:\Users\testUser\Documents\Framework\Javascript\featherstestNewService>"C:\Program Files\Git\mingw64\bin\curl.exe" 'http://localhost:3000/todos/' -H 'Content-Type: application/json' --data-binary '{ "text": "Do something" }'
curl: (1) Protocol "'http" not supported or disabled in libcurl
curl: (6) Couldn't resolve host 'application'
curl: (6) Couldn't resolve host 'text'
curl: (6) Couldn't resolve host 'Do something'
curl: (3) [globbing] unmatched close brace/bracket in column 1

C:\Users\testUser\Documents\Framework\Javascript\featherstestNewService>"C:\Program Files\Git\usr\bin\curl.exe" 'http://localhost:3000/todos/' -H 'Content-Type: application/json' --data-binary '{ "text": "Do something" }'
{"text":"Do something","id":38}

Update 5

From manual... curl --manual

  -d, --data <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. --data-raw is almost the
      same but does not have a special interpretation of the @ charac-
      ter.  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 com-
      mand 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. Post-
      ing 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. If you
      don't  want the @ character to have a special interpretation use
      --data-raw instead.

So I tried...

C:\Users\testUser>"C:\Program Files\Git\mingw64\bin\curl.exe" "http://localhost:3000/todos/" -H "'Content-Type:' 'application/json'" --data-binary text=doing --data complete=false
{"text":"doing","complete":"false","id":145}
C:\Users\testUser>"C:\Program Files\Git\mingw64\bin\curl.exe" "http://localhost:3000/todos/" -H "'Content-Type:' 'application/json'" --data-binary text=ding
{"text":"ding","id":146}

But I cant figure out how to make more than 1 word for the JSON object for example instead of "doing", I need "doing something". Seems that MingW64 git curl is accepting different format...

After modifying the curl command it works for you, because you need to use double quote for windows system.

After modifying the command, you have mistakenly added single quote around the application/json . That's why despite of having working curl command server was unsure what you have exactly sent to them!

"Content-Type: 'application/json'"
               ^                ^ notice the unwanted singles

So it should be

"Content-Type: application/json"

If you do not provide path for any binary (ie curl.exe, mysql.exe, php.exe, etc) then system looks for them inside the available paths provided in PATH variable and if they found multiple path there then it will only select one, and I don't know which one!

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM