【问题标题】:How to create a RESTful client on Google App Engine?如何在 Google App Engine 上创建 RESTful 客户端?
【发布时间】:2012-09-04 19:54:41
【问题描述】:

我正在尝试在使用 Json 的 Google App Engine (Java) 上创建一个 RESTful Web 服务客户端。我试过 Sitebricks 和 Jersey,但它们似乎都不起作用。是否有任何框架可用于在 GAE 上创建 RESTful Web 服务客户端?

Sitebricks 的例外情况:

Caused by: java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "modifyThreadGroup")
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:366)
    at java.security.AccessController.checkPermission(AccessController.java:555)
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
    at com.google.appengine.tools.development.DevAppServerFactory$CustomSecurityManager.checkPermission(DevAppServerFactory.java:283)
    at com.google.appengine.tools.development.DevAppServerFactory$CustomSecurityManager.checkAccess(DevAppServerFactory.java:308)
    at java.lang.ThreadGroup.checkAccess(ThreadGroup.java:315)
    at java.lang.Thread.init(Thread.java:376)
    at java.lang.Thread.<init>(Thread.java:525)
    at com.ning.http.client.AsyncHttpClientConfig$Builder$2.newThread(AsyncHttpClientConfig.java:421)
    at java.util.concurrent.ThreadPoolExecutor$Worker.<init>(ThreadPoolExecutor.java:598)
    at java.util.concurrent.ThreadPoolExecutor.addWorker(ThreadPoolExecutor.java:913)
    at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1336)
    at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:132)
    at com.ning.http.client.providers.jdk.JDKAsyncHttpProvider.execute(JDKAsyncHttpProvider.java:156)
    at com.ning.http.client.providers.jdk.JDKAsyncHttpProvider.execute(JDKAsyncHttpProvider.java:123)
    at com.ning.http.client.AsyncHttpClient.executeRequest(AsyncHttpClient.java:496)
    at com.google.sitebricks.client.AHCWebClient.simpleRequest(AHCWebClient.java:85)
    at com.google.sitebricks.client.AHCWebClient.get(AHCWebClient.java:133)

对于泽西岛:

Caused by: java.security.AccessControlException: access denied ("javax.xml.bind.JAXBPermission" "setDatatypeConverter")
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:366)
    at java.security.AccessController.checkPermission(AccessController.java:555)
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
    at com.google.appengine.tools.development.DevAppServerFactory$CustomSecurityManager.checkPermission(DevAppServerFactory.java:283)
    at javax.xml.bind.DatatypeConverter.setDatatypeConverter(DatatypeConverter.java:134)
    at com.sun.xml.bind.v2.runtime.JAXBContextImpl$3.run(JAXBContextImpl.java:304)
    at com.sun.xml.bind.v2.runtime.JAXBContextImpl$3.run(JAXBContextImpl.java:303)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.xml.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:302)
    at com.sun.xml.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1170)
    at com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:145)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:248)
    at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:235)
    at javax.xml.bind.ContextFinder.find(ContextFinder.java:432)
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:637)
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:584)
    at com.sun.jersey.core.provider.jaxb.AbstractJAXBProvider.getStoredJAXBContext(AbstractJAXBProvider.java:194)
    at com.sun.jersey.core.provider.jaxb.AbstractJAXBProvider.getJAXBContext(AbstractJAXBProvider.java:187)
    at com.sun.jersey.core.provider.jaxb.AbstractJAXBProvider.getUnmarshaller(AbstractJAXBProvider.java:139)
    at com.sun.jersey.core.provider.jaxb.AbstractJAXBProvider.getUnmarshaller(AbstractJAXBProvider.java:122)
    at com.sun.jersey.core.provider.jaxb.AbstractRootElementProvider.readFrom(AbstractRootElementProvider.java:111)
    at com.sun.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:565)
    at com.sun.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:517)
    at com.sun.jersey.api.client.WebResource.handle(WebResource.java:684)
    at com.sun.jersey.api.client.WebResource.get(WebResource.java:191)

【问题讨论】:

  • 在发出“GET”请求之前,您可能缺少凭据身份验证步骤。您可能需要先登录服务来建立会话。在发出 GET 之前在客户端上设置您的身份验证模型和凭据。
  • 我关注了tugdualgrall.blogspot.com/2010/02/…,它对我有用,没有任何问题。
  • @LarryHector 不,不是这样,它在普通 Jetty 上无需身份验证即可完美运行。 AccessControlExceptions 是由于 AppEngine 中的沙盒限制造成的。
  • @Devashish 那篇文章描述了如何创建一个web服务服务器,我需要一个web服务客户端。

标签: java json google-app-engine rest client


【解决方案1】:

google-api-java-client怎么样?

在某种程度上,您所需要的只是发出 HTTP 请求并将响应解析为 JSON 的能力。除了让 Jersey/Sitebricks 对您更具吸引力之外,您还在寻找哪些功能?

【讨论】:

  • 感谢您的提示。我不知道 google-http-java-client。我会看看。我需要 SSL 支持,并且我已经在使用 Sitebricks 来提供 HTML 页面和 RESTful Web 服务。
【解决方案2】:

试试jello-framework。它允许您通过 RESTful (OData) 服务公开您的数据模型,并提供开箱即用的 UI 视图,因此您可以测试您的应用程序并立即开始与数据交互。

披露 - 我是 Jello 框架的创建者。尽管如此,我还是决定将它添加为 GAE 上 RESTful 客户端的有效答案,因为它可以为所提出的问题提供一个很好的解决方案。

【讨论】:

  • 嗨@bummi,你是对的,我应该添加一个披露(我刚刚做了)。但是,我隶属于 jello-framework 应该不会影响答案的有效性,只要它回答了问题。
猜你喜欢
  • 1970-01-01
  • 2013-11-05
  • 1970-01-01
  • 2013-10-21
  • 2019-03-16
  • 1970-01-01
  • 1970-01-01
  • 2015-07-26
  • 1970-01-01
相关资源
最近更新 更多