2

我有一个Cloud Endpoints看起来像这样的方法:

//HTTP POST
@ApiMethod(name = "hylyts.insert")
public Hylyt insertHylyt(@Named("url") String url, Hylyt hylyt, User user)
        throws OAuthRequestException{
    log.info("Trying to save hylyt '"+hylyt+"' with id '"+hylyt.getId());
    if (user== null) throw new OAuthRequestException("Your token is no good here.");
    hylyt.setArticle(getArticleKey(url, user));
    ofy().save().entity(hylyt);
    return hylyt;
}

Javascript Client Library使用这个来调用它:

gapi.client.hylytit.hylyts.insert({PARAMS}).execute(callback);

现在,如果我按照文档{PARAMS}中的建议进行构建(第二个示例),

{
  'url': url,
  'resource': {
    'hylyt': {
      'contentType': 'application/json',
      'data': hylyt
    }
  }
}

我在端点中得到一个空对象(更不用说这个库的全部意义在于使这些调用变得简单,这个结构显然违反了这一点)。

当我{PARAMS}按照这些 答案的建议进行构建时,

{
  'url': url,
  'resource': hylyt
}

我再次在端点中得到一个空对象。正确的语法是这样的:

{
  'url': url,
  'id': hylyt.id
  'text': hylyt.text
}

这让我大吃一惊。我做这一切都错了吗?这是一个错误吗?它只是因为也在后台gapi传递而发生吗?auth token

是的,我可以改用该语法,但是,如果它与在纯 javascript 中创建 srequest一样复杂,为什么还要使用该库呢?如果谷歌在文档中解释了事情发生的原因XHR,我不会介意复杂性。但是,解释一下,文档只是说使用这些方法,auth、CORS 和 XHR 的魔法将在闭门造车中发生。

4

3 回答 3

1

是的,同意这是一个错误。也给我带来了很大的痛苦。

所以我想解决方法是创建一个组合对象以将所有命名和未命名参数传递给您的 api。而不是硬编码每个..快速循环可能会更好。

var param = {};
param["url"] = url;
for (var prop in hylyt) {
  param[prop] = hylyt[prop];
}
gapi.client.hylytit.hylyts.insert(param).execute(callback);

如果你真的想要的话,参数/对象的混搭可以成为一个巧妙的功能......但它是我认为缺陷的创可贴。我在相关问题中看到(用于传输命名参数和正文的云端点资源属性不起作用),您实际上记录了一个缺陷......好东西。尽管在这一点上似乎仍然没有任何动静。祈祷有一天!

于 2014-04-24T02:41:21.483 回答
1

API 方法是否被正确识别为POST方法?

GET作为 POST 正文发送的资源参数在请求中无法正常工作。看起来您实际上是在发送GET带有查询字符串中 Hylyt 属性的请求。

为确保您可以将方法注释更改为此:

@ApiMethod(name = "hylyts.insert", httpMethod = HttpMethod.POST)
于 2013-11-15T10:37:36.723 回答
1

该错误已得到解决。正确的语法是

gapi.client.hylytit.hylyts.insert({url: url}, hylyt).execute(callback);
于 2015-01-14T02:40:28.450 回答