Не удалось получить настройки для группы Google с помощью клиентской библиотеки .NET.

В настоящее время я пишу систему, которая будет отвечать за создание и обслуживание групп Google таким образом, чтобы они были привязаны к нашим внутренним системам (и синхронизировались с ними).

В рамках этого я в настоящее время работаю над простым созданием группы, изменением ее настроек и последующим выделением некоторых участников в группу.

Пока что первая часть работает правильно, но затем вторая часть — с использованием API настроек групп Google — дает сбой. Кажется, что он всегда получает данные XML, когда ожидает JSON. Это приводит к сбою десериализации и, следовательно, генерируется исключение.

У меня есть последняя версия (на момент написания) клиентской библиотеки: Google.Apis.Groupssettings.v1 1.4.0.28227 (1.4.0-beta)

Это пример кода, который не работает:

// OAuth2.0/service account stuff here
var initializer = //...;
var settingsService = new GroupssettingsService(initializer);
var settings = settingsService.Groups.Get("[email protected]").Execute();

Все хорошо до последней строки, которая завершается ошибкой:

  • GoogleApiException: Произошла ошибка, но ответ об ошибке не может быть десериализован.
  • InnerException: Newtonsoft.Json.JsonReaderException: обнаружен непредвиденный символ при синтаксическом анализе значения: ‹. Путь '', строка 0, позиция 0.

Используя Fiddler, я заметил, что это ответ:

<?xml version="1.0" encoding="UTF-8"?>
<errors xmlns="http://schemas.google.com/g/2005">
 <error>
  <domain>GData</domain>
  <code>invalid</code>
  <internalReason>A system error has occurred</internalReason>
 </error>
</errors>

Я думаю, что ошибка может быть связана с тем, что группа создана недавно, но я пробовал и более старую группу и получил следующее:

HTTP/1.1 200 OK
Expires: Thu, 18 Jul 2013 13:00:13 GMT
Date: Thu, 18 Jul 2013 13:00:13 GMT
Cache-Control: private, max-age=0, must-revalidate, no-transform
ETag: "w9Sr8O0S9lDi5Pcv_43hXQkUtmA/TS0CjusfGhj0vG_aNIJAXkmNM4s"
Content-Type: application/atom+xml; charset=UTF-8
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
Content-Length: 1811
Server: GSE

<?xml version="1.0" encoding="UTF-8"?>
<entry xmlns="http://www.w3.org/2005/Atom" xmlns:apps="http://schemas.google.com/apps/2006" xmlns:gd="http://schemas.google.com/g/2005">
 <id>tag:googleapis.com,2010:apps:groupssettings:GROUP:[email protected]</id>
 <title>Groups Resource Entry</title>
 <content type="text">An example group</content>
 <author>
  <name>Google</name>
 </author>
 <apps:email>[email protected]</apps:email>
 <apps:name>An example group</apps:name>
 <apps:description/>
 <apps:whoCanJoin>CAN_REQUEST_TO_JOIN</apps:whoCanJoin>
 <apps:whoCanViewMembership>ALL_MANAGERS_CAN_VIEW</apps:whoCanViewMembership>
 <apps:whoCanViewGroup>ALL_MEMBERS_CAN_VIEW</apps:whoCanViewGroup>
 <apps:whoCanInvite>ALL_MANAGERS_CAN_INVITE</apps:whoCanInvite>
 <apps:allowExternalMembers>false</apps:allowExternalMembers>
 <apps:whoCanPostMessage>ANYONE_CAN_POST</apps:whoCanPostMessage>
 <apps:allowWebPosting>true</apps:allowWebPosting>
 <apps:maxMessageBytes>5242880</apps:maxMessageBytes>
 <apps:isArchived>false</apps:isArchived>
 <apps:archiveOnly>false</apps:archiveOnly>
 <apps:messageModerationLevel>MODERATE_NONE</apps:messageModerationLevel>
 <apps:spamModerationLevel>MODERATE</apps:spamModerationLevel>
 <apps:replyTo>REPLY_TO_IGNORE</apps:replyTo>
 <apps:customReplyTo/>
 <apps:sendMessageDenyNotification>false</apps:sendMessageDenyNotification>
 <apps:defaultMessageDenyNotificationText/>
 <apps:showInGroupDirectory>false</apps:showInGroupDirectory>
 <apps:allowGoogleCommunication>false</apps:allowGoogleCommunication>
 <apps:membersCanPostAsTheGroup>false</apps:membersCanPostAsTheGroup>
 <apps:messageDisplayFont>DEFAULT_FONT</apps:messageDisplayFont>
 <apps:includeInGlobalAddressList>true</apps:includeInGlobalAddressList>
</entry>

Так что даже тогда он все еще не десериализуем и, следовательно, не работает.

Что я делаю не так, если что?


person Mark Embling    schedule 18.07.2013    source источник


Ответы (1)


Клиентская библиотека .NET не поддерживает XML, а API Groupssettings поддерживает как Atom, так и JSON. Мое предложение для вас сделать следующее:

var getRequest = settingsService.Groups.Get("[email protected]");
getRequest.Alt = "json";
var settings = getRequest.Execute();
person peleyal    schedule 18.07.2013
comment
Я так и думал, но предположил, что клиентская библиотека автоматически запросит представление, которое она может обработать. Я искал способ заставить его запрашивать JSON, но ничего не нашел. Завтра попробую на работе. Спасибо за Ваш ответ :-) - person Mark Embling; 18.07.2013
comment
Пожалуйста, дайте мне знать :) - person peleyal; 19.07.2013
comment
Вроде получилось, спасибо :-). Я все еще иногда сталкиваюсь с ошибкой 400, но, как я уже говорил, я могу только предположить, что это связано с тем, что я запрашиваю ее сразу после ее создания. По крайней мере, ошибка предоставляется в формате JSON. - person Mark Embling; 19.07.2013