简体   繁体   中英

POST request with Powershell 2.0 using cURL

Scenario

Among other things, Powershell 2.0 doesn't have the useful cmdlet Invoke-RestMethod.

I can't upgrade to version 3 and most examples I've found use version 3.

I have found this article , which seems, however, too complicated for my simple scenario.

I need to write a Powershell script that POSTs data in Json format, eg

{"Id":5,"Email":"test@com","DataFields":null,"Status":0}

What I've tried

I am able to GET data. This is one of the scripts I have tried.

curl -v --user username:password https://api.dotmailer.com/v2/account-info

But, when I try to POST, I can't figure out where to put the body of the message in the script. This is what I've got so far:

curl -v -X POST -H "Accept: application/json" -H "Content-Type: application/json" -u username:password -d '{"Id":5,"Email":"test@com","OptInType":0,"EmailType":0, "DataFields":null,"Status":0}' https://api.dotmailer.com/v2/contacts

which returns the following error:

{"message":"Could not parse the body of the request based on the content type \\"application/json\\" ERROR_BODY_DOES_NOT_MATCH_CONTENT_TYPE"}*

Question

Can anyone advise on how to POST Json data from Powershell using cURL?

Any pointers to why I get the error I mentioned in the Waht I've tried section would be much appreciated.

Thanks.

Note that the question is about the curl.exe external program , not about PowerShell's Invoke-WebRequest cmdlet (which, unfortunately, is aliased to curl in later PowerShell versions, preempting calls to the external program unless the .exe extension is explicitly specified ( curl.exe ... ).

Unfortunately and unexpectedly, you have to \\ -escape embedded " instances in a string you pass as an argument to an external program .

Therefore, even though:

'{"Id":5,"Email":"test@com","DataFields":null,"Status":0}'

should work, it doesn't, due to a long-standing bug ; instead, you must use:

'{\"Id\":5,\"Email\":\"test@com\",\"DataFields\":null,\"Status\":0}'

See this answer for more information.

从 curl 的手册页看来,您需要使用-d开关:

curl -v --user username:password -H "Content-Type: application/json" -d '{"Id":5,"Email":"test@com","DataFields":null,"Status":0}' https://api.dotmailer.com/v2/contacts

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