使用 google-api 和使用 Atom 序列化/解析器时如何设置默认命名空间或如何定义 @key 值

发布于 2024-11-25 19:23:51 字数 4648 浏览 2 评论 0原文

我在 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:title - 我不明白它,但它有效。

问题是我无法将 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(); 

传输和命名空间是:

private static final 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: unrecognized alias: (default) W/System.err(1957):位于 com.google.common.base.Preconditions.checkArgument(Preconditions.java:115) W/System.err(1957):位于 com.google.api.client.xml.XmlNamespaceDictionary.getNamespaceUriForAliasHandlingUnknown(XmlNamespaceDictionary.java:288) W/System.err( 1957): at 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 管理命名空间?

I'm having trouble with Atom parsing/serializing - clearly something related to the namespace and the default alias - but I can;t figure out what I'm doing wrong.

I have two methods - one that I'm trying to do a GET and see if an album is defined and what that tries to do a POST to create the album (if it does not exist).

The GET I managed to get working - although there too I'm pretty sure I am doing something wrong because it is different from the PicasaAndroidSample. Specifically, if I define:

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"); 
}

Then the following code does indeed get all the albums:

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;
                }
            }

But - if instead I have:

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"); 
}

Then the feed has an empty collection - i.e. the parser does not know that this is Atom (my guess).

I can live with the android:title in my classes - I don;t get it, but it works.

The problem is that I can't get the POST to wok (to create the album). This code is:

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(); 

The transport and namespace are:

private static final HttpTransport transport = new ApacheHttpTransport(); // my libraries don;t include 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;
}

If I use

@Key("title")
public String title;

then I get an exception that it does not have a default namespace:

W/System.err( 1957): java.lang.IllegalArgumentException: unrecognized alias: (default)
W/System.err( 1957): at 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): at com.google.api.client.xml.XmlNamespaceDictionary.startDoc(XmlNamespaceDictionary.java:224)

and if I use

@Key("atom:title")
public String title;

then it does serialize but each element has the atom: prefix and the call fails - when I to a tcpdump on it I see something like

.`....<? 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
....

What do I need to do different in order to use

@Key("title")
public String title;

and have both the GET and the POST manage the namespace?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

绳情 2024-12-02 19:23:51

看来您正在添加重复的字典键或序列化程序无法理解的键。

请改用以下内容。

static final XmlNamespaceDictionary DICTIONARY = new XmlNamespaceDictionary()
      .set("", "http://www.w3.org/2005/Atom")
      .set("activity", "http://activitystrea.ms/spec/1.0/")
      .set("georss", "http://www.georss.org/georss")
      .set("media", "http://search.yahoo.com/mrss/")
      .set("thr", "http://purl.org/syndication/thread/1.0");

It looks you are adding either duplicate dictonary keys or keys that are not understood by the serializer.

Use the following instead.

static final XmlNamespaceDictionary DICTIONARY = new XmlNamespaceDictionary()
      .set("", "http://www.w3.org/2005/Atom")
      .set("activity", "http://activitystrea.ms/spec/1.0/")
      .set("georss", "http://www.georss.org/georss")
      .set("media", "http://search.yahoo.com/mrss/")
      .set("thr", "http://purl.org/syndication/thread/1.0");
じее 2024-12-02 19:23:51

删除“atom”项命名空间的显式设置为我解决了这个问题。

Removing the explicit set for the "atom" item namespace solved this issue for me.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文