У меня проблемы с синтаксическим анализом / сериализацией Atom - очевидно, что-то, связанное с пространством имен и псевдонимом по умолчанию - но я не могу понять, что я делаю неправильно.
У меня есть два метода - один, который я пытаюсь сделать GET и посмотреть, определен ли альбом, и что он пытается сделать POST, чтобы создать альбом (если он не существует).
ПОЛУЧИТЬ, что мне удалось получить работу - хотя и там я вполне уверен, что я делаю что-то не так, потому что это отличается от PicasaAndroidSample. В частности, если я определю:
public class EDAlbum {
@Key("atom:title")
public String title;
@Key("atom:summary")
public String summary;
@Key("atom:gphoto:access")
public String access;
@Key("atom:category")
public EDCategory category = EDCategory.newKind("album");
}
Тогда следующий код действительно получит все альбомы:
PicasaUrl url = PicasaUrl.relativeToRoot("feed/api/user/default");
HttpRequest request = EDApplication.getRequest(url);
HttpResponse res = request.execute();
EDAlbumFeed feed = res.parseAs(EDAlbumFeed.class);
boolean hasEDAlbum = false;
for (EDAlbum album : feed.items) {
if (album.title.equals(EDApplication.ED_ALBUM_NAME)) {
hasEDAlbum = true;
break;
}
}
Но - если вместо этого у меня есть:
public class EDAlbum {
@Key("title")
public String title;
@Key("summary")
public String summary;
@Key("gphoto:access")
public String access;
@Key("category")
public EDCategory category = EDCategory.newKind("album");
}
Тогда у ленты есть пустая коллекция - то есть парсер не знает, что это Atom (мое предположение).
Я могу жить с android: название в моих классах - я не понимаю, но это работает.
Проблема в том, что я не могу заставить POST работать (для создания альбома). Этот код:
EDAlbum a = new EDAlbum();
a.access = "public";
a.title = EDApplication.ED_ALBUM_NAME;
a.summary = c.getString(R.string.ed_album_summary);
AtomContent content = new AtomContent();
content.entry = a;
content.namespaceDictionary = EDApplication.getNamespaceDictionary();
PicasaUrl url = PicasaUrl.relativeToRoot("feed/api/user/default");
HttpRequest request = EDApplication.postRequest(url, content);
HttpResponse res = request.execute();
Транспорт и пространство имен:
приватная статическая финальная HttpTransport transport = new ApacheHttpTransport (); // мои библиотеки не включают GoogleTransport.
private static HttpRequestFactory createRequestFactory(final HttpTransport transport) {
return transport.createRequestFactory(new HttpRequestInitializer() {
public void initialize(HttpRequest request) {
AtomParser parser = new AtomParser();
parser.namespaceDictionary = getNamespaceDictionary();
request.addParser(parser);
}
});
}
public static XmlNamespaceDictionary getNamespaceDictionary() {
if (nsDictionary == null) {
nsDictionary = new XmlNamespaceDictionary();
nsDictionary.set("", "http://www.w3.org/2005/Atom");
nsDictionary.set("atom", "http://www.w3.org/2005/Atom");
nsDictionary.set("exif", "http://schemas.google.com/photos/exif/2007");
nsDictionary.set("gd", "http://schemas.google.com/g/2005");
nsDictionary.set("geo", "http://www.w3.org/2003/01/geo/wgs84_pos#");
nsDictionary.set("georss", "http://www.georss.org/georss");
nsDictionary.set("gml", "http://www.opengis.net/gml");
nsDictionary.set("gphoto", "http://schemas.google.com/photos/2007");
nsDictionary.set("media", "http://search.yahoo.com/mrss/");
nsDictionary.set("openSearch", "http://a9.com/-/spec/opensearch/1.1/");
nsDictionary.set("xml", "http://www.w3.org/XML/1998/namespace");
}
return nsDictionary;
}
Если я использую
@Key("title")
public String title;
тогда я получаю исключение, что у него нет пространства имен по умолчанию:
W / System.err (1957): java.lang.IllegalArgumentException: нераспознанный псевдоним: (по умолчанию)
W / System.err (1957): на com.google.common.base.Preconditions.checkArgument (Preconditions.java:115)
W / System.err (1957): at com.google.api.client.xml.XmlNamespaceDictionary.getNamespaceUriForAliasHandlingUnknown (XmlNamespaceDictionary.java:288)
W / System.err (1957): по адресу com.google.api.client.xml.XmlNamespaceDictionary.startDoc (XmlNamespaceDictionary.java:224)
и если я использую
@Key("atom:title")
public String title;
затем он сериализуется, но у каждого элемента есть префикс atom: и вызов завершается неудачно - когда я запускаю tcpdump, я вижу что-то вроде
.`....<? xml vers
ion='1.0 ' encodi
ng='UTF- 8' ?><at
om:entry xmlns:a
tom="htt p://www.
w3.org/2 005/Atom
"><atom: category
scheme= "http://
schemas. google.c
om/g/200 5#kind"
term="ht tp://sch
emas.goo gle.com/
photos/2 007#albu
m" /><at om:gphot
o:access >public<
/atom:gp hoto:acc
....
Что мне нужно сделать по-другому, чтобы использовать
@Key("title")
public String title;
а GET и POST управляют пространством имен?