Servicem8 API cURL Post

时间:2017-07-18 03:43:02

标签: curl servicem8

我对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中,

有什么建议吗?

由于

2 个答案:

答案 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,则格式如下:

  • myname@domain.com:输入mypassword
  • 将其转换为base64为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"

从批处理脚本执行