4

我成功地使用 cURL 创建了一个新联系人,但是当我想为此联系人添加组成员身份时,我收到 400 错误。我已经阅读了这个文档 并提出了同样的要求,但它没有用。我究竟做错了什么?感谢您的任何想法!

这就是我使用组信息创建 XML 的方式:

$doc = new DOMDocument('1.0', 'UTF-8');
$doc->formatOutput = true;

$entry = $doc->createElement('entry');
$entry->setAttribute('gd:etag', $etag);
$doc->appendChild($entry);

$category = $doc->createElement('category');
$category->setAttribute('scheme', 'http://schemas.google.com/g/2005#kind');
$category->setAttribute('term', 'http://schemas.google.com/contact/2008#contact');
$entry->appendChild($category);

$id = $doc->createElement('id', 'http://www.google.com/m8/feeds/contacts/default/base/'.$idgmail);
$entry->appendChild($id);

$updated = $doc->createElement('updated', $update_info);
$entry->appendChild($updated);

// Add group info (My Contacts)

$group = $doc->createElement('gContact:groupMembershipInfo');
$entry->appendChild($group);
$group->setAttribute('deleted', 'false');
$group->setAttribute('href', 'http://www.google.com/m8/feeds/groups/default/base/6');

// Add another group info

$group = $doc->createElement('gContact:groupMembershipInfo');
$entry->appendChild($group);
$group->setAttribute('deleted', 'false');
$group->setAttribute('href', 'http://www.google.com/m8/feeds/groups/default/base/'.$my_group_id);

$group_info = $doc->saveXML();

这是我的卷曲:

$url = 'https://www.google.com/m8/feeds/contacts/default/full/'.$idgmail.'/';

$headers = array(
'Host: www.google.com',
'Gdata-version: 3.0',
'Content-length: '.strlen($group_info),
'Content-type: application/atom+xml',
'If-Match: *',
'Authorization: OAuth '.$access,
);

$curl = curl_init();

curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $group_info);
curl_setopt($curl, CURLOPT_FAILONERROR, true);

$resp = curl_exec($curl); 
print_r($resp); // Prints nothing
echo curl_getinfo($curl, CURLINFO_HTTP_CODE); // Gives 400
curl_close($curl);
4

1 回答 1

8

好的,我自己想通了:)
1) 首先,要更新联系人,您应该使用 PUT 请求,而不是 POST。
2)在您的 XML 中,您不能使用“默认”(您会收到另一个错误),您应该使用完整的电子邮件地址:

$group = $doc->createElement('gContact:groupMembershipInfo');
$entry->appendChild($group);
$group->setAttribute('deleted', 'false');
$group->setAttribute('href', 'http://www.google.com/m8/feeds/groups/user.email@gmail.com/base/6');  

3) 如果您没有指定命名空间 gContact,您将收到 400 错误。入口标签的整个内容应该是这样的:

$entry = $doc->createElement('entry');
$entry->setAttribute('xmlns', 'http://www.w3.org/2005/Atom');
$entry->setAttribute('xmlns:gd', 'http://schemas.google.com/g/2005');
$entry->setAttribute('xmlns:gContact', 'http://schemas.google.com/contact/2008');
$doc->appendChild($entry); 

4)最后,要将联系人添加到特定组,您不需要更新它(正如我从文档中想到的那样),您可以在创建联系人时进行(是的,现在看起来很明显)。如果您尝试更新联系人组而不先创建它,您将收到 400 错误(条目没有设置任何字段)。
希望这会对某人有所帮助!
PS 为了解决这些问题,我使用了 Google 的“OAuth 2.0 Playground”,非常有用!https://developers.google.com/oauthplayground/

于 2013-03-22T19:57:30.757 回答