Сегодня рассмотрим три готовых метода для работы с изображениями в Google Contacts API. Эти методы включены в модуль Dephi, реализующий работу с API, который я рассматривал в этом посте. В процессе работы с изображениями натолкнулся на одну интересную особенность…но обо всем по порядку.
1. Загрузка фотографии контакта GMail
Об этом я рассказывал здесь, но для целостности картины, приведу полный листинг процедуры:
function TContact.RetriveImage:TJPEGImage; var i:integer; begin Result:=nil; for i:=0 to FLinks.Count - 1 do //ищем ссылку на изображение по атрибуту rel begin if FLinks[i].Rel='http://schemas.google.com/contacts/2008/rel#photo' then begin if Length(FLinks[i].Etag)>0 then //если ETag не пустой, то по этому адресу есть изображение begin Result:=TJPEGImage.Create; Result.LoadFromStream(SendRequest('GET',FLinks[i].Href,Owner.FAuth,CpProtocolVer,nil,nil));//загружаем изображение break;//прерываем цикл end; end; end; end;
При этом, как я уже упоминал, вне зависимости от того изображение какого формата (jpg, png или gif) мы загружали — в ответ нам приходит изображение в формате jpg, что для нас намного проще — не надо анализировать формат принятого изображения.
1. Обновление фотографии контакта GMail
При обновлении изображения контакта нам необходимо знать два значения:
1. URL на который отправлять новое изображение
2. ETag старого изображения. ETag должен включаться в заголовок сообщения If-Match.
Кстати, если нам не важно какую версию фотографии обновлять, то вместо ETag можно использовать «*».
Процедура обновления изображения для контакта GMail выглядит следующим образом:
procedure TContact.UpdatePhoto(const PhotoFile: TFileName); var i: Integer; begin for i:= 0 to FLinks.Count - 1 do begin if FLinks[i].Ltype='image/*' then begin with THTTPSend.Create do begin Headers.Add('GData-Version: '+CpProtocolVer);//версия 3.0 Headers.Add('Authorization: GoogleLogin auth=' + Self.FOwner.FAuth); MimeType := 'image/*';//обязательно указываем этот тип Headers.Add('If-Match: *');//обновляем изображение в любом случае Document.LoadFromFile(PhotoFile);//загружаем фото в поток if HTTPMethod('PUT',FLinks[i].Href) then //отправляем на сервер begin {здесь необходим анализ возвращенного документа} end else ShowMessage(IntToStr(ResultCode)+' '+ResultString); end; break; end; end; end;
Я не стал приводить в процедуре анализ документа на наличие ошибок, т.к. это тема отдельной статьи, но скажу, что необходимо как минимум проверять возвращенные данные на наличие XML-тега entry. Дело в том, что если при отправке нового изображения были допущены ошибки, например, неправильно сформированы заголовки, отправлен не поддерживаемый формат и т.д., то результатом выполнения HTTPSend будет «200 OK», а в документе будет содержаться сообщение об ошибке в виде простого plaintext. В противном случае, когда изображение успешно обновлено, нам вернется документ примерно такого содержания:
<?xml version=»1.0″ encoding=»UTF-8″ ?>— <entry xmlns=»http://www.w3.org/2005/Atom» xmlns:gd=»http://schemas.google.com/g/2005» gd:etag=»«Mh5ye3s6Sit7ImBZGW4AFxteMmwjJWZ5cTU.»«><id>http://www.google.com/m8/feeds/photos/media/vlad383%40gmail.com/54cbb4f68a234171</id><updated>2010-04-26T15:21:52.215Z</updated><app:edited xmlns:app=»http://www.w3.org/2007/app«>2010-04-26T15:21:52.215Z</app:edited><link rel=»self» type=»application/atom+xml» href=»http://www.google.com/m8/feeds/photos/media/vlad383%40gmail.com/54cbb4f68a234171» /><link rel=»edit» type=»application/atom+xml» href=»http://www.google.com/m8/feeds/photos/media/vlad383%40gmail.com/54cbb4f68a234171» /></entry>
3. Удаление фотографии для контакта GMail.
В целом процедура удаления фотографии идентична предыдущей — на редактирование. Используется тот же URL, те же заголовки, но только запрос не PUT, а DELETE. Поэтому приводить полный листинг процедуры лишь из-за одного слова — смысла нет. Но при удалении фотографий контактов есть один тонкий момент, который необходимо рассмотреть. Момент этот касается работы с изображением контакта для владельца аккаунта GMail. Дело в том, что используя Google Contacts API вы можете загружать для своей записи в контактах изображения также как и для любого другого контакта, но удалить сможете только одно — последнее. Наткнулся на это совершенно случайно, когда начал редактировать свою запись в контактах через API. Смотрите. У меня в аккаунте Google установлено изображение:
Я ради проверки загрузил ещё одно в Контакты:
Как и полагается в контактах стало отображаться последнее загруженное изображение. Теперь пробую удалить изображение через API — вторая картинка удаляется и на её место устанавливается первая (с назгулом) и никаким макаром не удаляется, хотя сервер на удаление отвечает «200 OK», типо все удалено.
Скорее всего этот момент связан с тем, что первое изображение относится не к контакту, а именно к профилю поэтому с использованием Contacts API оно и не удаляется.
Сейчас пробую разобраться с тем как менять фотку именно на аккаунте, должно быть решение, но пока его не обнаружил в документации.