Мне удалось создать новый контакт с 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();
И это мой cURL:
$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);
Хорошо, я сам это понял.
1) Прежде всего, чтобы обновить контакт, вы должны использовать запрос PUT, а не POST.
2) В вашем XML вы не можете использовать «default» (вы получите еще одну ошибку), вы должны использовать полный адрес электронной почты:
$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) Вы получите ошибку 400, если вы не указали пространство имен gContact. Вся вещь для тега записи должна выглядеть так:
$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/