使用CURL创建联系人的Office 365 REST API获取HTTP代码400错误请求

时间:2014-10-16 07:58:36

标签: api rest curl contacts office365

我在此链接后使用CURL测试Office 365 REST API:

Contacts REST API in Office 365 APIs Preview

我可以在Windows中使用curl命令正确获取一个联系人:

curl --no-sessionid --insecure --basic --user "user@domain.com:password" -H "Accept: application/json" "https://outlook.office365.com/EWS/OData/Me/Contacts?$orderby=DisplayName+asc&$top=1"

如果我尝试使用CURL创建一个联系人并使用最少的测试选项,请关注此链接的文档:

curl -X POST -d "{\"@odata.type\": \"#Microsoft.Exchange.Services.OData.Model.Contact\",\"GivenName\": \"TestContact\",\"EmailAddress1\": \"test@test.com\",\"BusinessPhone1\": \"123-456-7890\"}" https://outlook.office365.com/ews/odata/Me/Contacts --header "Content-Type:application/json" --insecure --verbose --user "user@domain.com:password"

我收到以下错误:

* About to connect() to outlook.office365.com port 443 (#0)
*   Trying 157.56.250.178...
* connected
* Connected to outlook.office365.com (157.56.250.178) port 443 (#0)
* SSLv3, TLS handshake, Client hello (1):
...
* SSL connection using ECDHE-RSA-AES256-SHA
* Server certificate:
...
* Server auth using Basic with user 'user@domain.com'
> POST /ews/odata/Me/Contacts HTTP/1.1
...
> Content-Length: 157
>
* upload completely sent off: 157 out of 157 bytes
< HTTP/1.1 400 Bad Request
...
< Content-Length: 82
<
{"error":{"code":"ErrorInvalidRequest","message":"Cannot read the request body."}}* Connection #0 to host outlook.office365.com left intact
* Closing connection #0
* SSLv3, TLS alert, Client hello (1):

我已经搜索了互联网和stackoverflow,但类似的问题没有我正在寻找的答案。

我如何使用CURL创建联系人?我在Linux上测试过它,但结果相同。

3 个答案:

答案 0 :(得分:3)

当我从Fiddler尝试时,以下请求有效。你能用CURL试试吗?

POST https://outlook.office365.com/ews/odata/Me/Contacts HTTP/1.1
Authorization: Basic <XXXX>
Content-Type: application/json

{
  "GivenName" : "John",
  "EmailAddresses" : [ 
    { "Address": "John@contoso.com", "Name" : "John" }
  ],
  "BusinessPhones" : [
    "123-456-7890"
  ]
}

我对您的请求做了一些更改。您不需要指定OData.type,因为我们推断您要添加联系人,因为您要向Contacts集合发送POST。我们需要修复我们的文档,因为它根据需要列出了实体类型。我们已将命名空间更新为Microsoft.OutlookServices,因此类型定义已更改。为了使API更易于使用,我们已将EmailAddress1,EmailAddress2等替换为EmailAddresses集合。同样,我们也将BusinessPhones,HomePhones等更改为集合。

正如我刚才在另一个post中解释的那样,您看到的问题来自某些changes being rolled out to our preview APIs,我们的文档正在更新中。当前的一系列更改包括版本控制支持,这不会成为未来的问题。

如果您有任何疑问或需要更多信息,请与我们联系。

谢谢,

Venkat

答案 1 :(得分:0)

使用以下CURL命令完美无缺:

curl -X POST -d "{\"GivenName\":\"John\",\"EmailAddresses\":[{\"Address\":\"John@contoso.com\",\"Name\":\"John\"}],\"BusinessPhones\":[\"123-456-7890\"]}" https://outlook.office365.com/ews/odata/Me/Contacts --header "Content-Type:application/json" --insecure --verbose --user "user@domain.com:password"

现在我们可以导出联系人(OWA不允许这样做)并使用像curl这样的简单实用程序导入它。

感谢您帮助Venkat。

答案 2 :(得分:0)

您的原始帖子显示以下命名空间: Microsoft.Exchange.Services.OData.Model.Contact

已改为: Microsoft.Office365.OutlookServices.Contact

由于名称空间错误,因此无法读取请求正文。