我对cURL发布命令有一点问题
curl --user "user:pass" --request POST https://api.servicem8.com/api_1.0/note.json --data '{"note":"AdvNotice 48 Hours","related_object":"company","related_object_uuid":"b1cca357-5e00-464e-b66c-8546d6b4963b"}'
我收到回复
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>400 Bad Request</title>
</head>
<body>
<h1>Bad Request</h1>
<p>Bad Request. No data received in POST</p>
<hr />
<address>ServiceM8/1</address>
</body>
</html>
我已经摆弄了一点,并试图通过REST客户端发布这些数据,这种方法很好但只是没有在cURL中,
有什么建议吗?
由于
答案 0 :(得分:1)
您需要将Content-Type
标头设置为application/json
,如果您想要json结果而不是xml,请添加标头Accept: application/json
:
curl -u "user:password" "https://api.servicem8.com/api_1.0/note.json" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"note" : "AdvNotice 48 Hours",
"related_object" : "company",
"related_object_uuid" : "b1cca357-5e00-464e-b66c-8546d6b4963b"
}'
一个班轮:
curl -u "user:password" "https://api.servicem8.com/api_1.0/note.json" -H "Accept: application/json" -H "Content-Type: application/json" -d "{\"note\" : \"AdvNotice 48 Hours\", \"related_object\" : \"company\", \"related_object_uuid\" : \"b1cca357-5e00-464e-b66c-8546d6b4963b\" }"
答案 1 :(得分:0)
我无法想到想在CMD中使用它。
但是有一个很好的理由想在Windows中使用它,而不需要例如cygwin。
您可以在PowerShell中执行此操作。
-u
中的cURL
选项不可移植。您应该了解它是cURL
特定功能,它将尝试许多常见的身份验证类型。在这种情况下,它是basic。因此,为了良好的实践,在脚本和程序中,您应该使用-H "Authorization: Basic <base64-Data>
例如;
如果我的用户名为myname@domain.com
,密码为mypassword
,则格式如下:
bXluYW1lQGRvbWFpbi5jb206bXlwYXNzd29yZA==
Authorization: Basic bXluYW1lQGRvbWFpbi5jb206bXlwYXNzd29yZA==
cURL
选项:-H "Authorization: Basic bXluYW1lQGRvbWFpbi5jb206bXlwYXNzd29yZA=="
要创建base64标头,就像在GNU终端中输入一样简单:
echo -n 'myname@domain.com:mypassword' | openssl base64 -base64
或者使用PowerShell builtins:
[Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("myname@domain.com:mypassword")))
您可以使用PowerShell ISE在Windows中为此创建模板。
例如,在ServiceM8中,这将列出您的所有客户端:
$user = 'username@domain.com'
$pass = 'myPassword'
$method = 'GET'
$base64Creds = "Basic " + [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(($user+":"+$pass)))
$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
$headers.Add("Content-Type", 'application/json')
$headers.Add("Authorization", $base64Creds)
$response = Invoke-RestMethod 'https://api.servicem8.com/api_1.0/company.json' -Method $method -Headers $headers
Write-Output $response
您可以通过将$method
更改为POST并添加内容正文来发布数据,如上所述here:
将您的参数放在哈希表中并像这样传递:
$postParams = @{username='me';moredata='qwerty'} Invoke-WebRequest -Uri http://example.com/foobar -Method POST -Body $postParams
在PowerShell中,您可以访问输出对象的属性。 $response.name
,$response.billing_address
,$response.uuid
等。
如果您绝对必须使用CMD,那么我建议将上述内容整合到ps1
文件中并使用powershell -executionPolicy bypass -file "C:\Users\Whatever\MyCmd.ps1"