2

对不起,如果这是一个简单的问题,但我只是不知道我应该做什么,我认为我在这里有点超出我的深度。我想将数据从 Android 应用程序发送到我在 Google App Engine 上运行的应用程序。必须从那里将数据写入数据存储区。我的数据主要是对象的形式,我正在使用 Java。

我遇到了以下问题:how-can-i-connect-a-google-app-engine-application-with-my-android

我想我明白 Android 端会发生什么。我也了解 doPost 方法的工作原理以及它应该做什么。但我的问题是,我现在如何使用 PersistenceManagerFactory 将此数据写入我的数据存储区,或检索它?即,如果我想在那里使用 PersistenceManagerFactory,doPost 中的代码会怎样?

本质上,我的移动应用程序必须能够像我的 AppEngine 应用程序那样进行数据检索/写入。

还是我应该忘记这种方法并做一些不同的事情?

任何指向正确方向的指针将不胜感激!

编辑:

我已经开始实施 Sam 的解决方案,如下所示。但是,有些事情仍然不对劲。这是我目前正在做的事情:

在我的 GAE 应用程序的 web.xml 中映射我的 servlet:

<servlet>
    <servlet-name>this_servlet</servlet-name>
<servlet-class>*app-details*.server.JsonNews</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>this_servlet</servlet-name>
    <url-pattern>/my_app/my_app_place</url-pattern>
</servlet-mapping>

doPost() 方法的实现与 Sam 的相同。

在我的 Android 应用中:

DefaultHttpClient hc=new DefaultHttpClient();
ResponseHandler <String> res=new BasicResponseHandler();
HttpPost postMethod=new HttpPost("http://my_application.appspot.com/my_app/my_app_place");
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();  
nameValuePairs.add(new BasicNameValuePair("value1", "Value my user entered"));  
postMethod.setEntity(new UrlEncodedFormEntity(nameValuePairs));  
String response=hc.execute(postMethod,res);

但是,hc.execute 方法失败,并为我提供以下消息:内部服务器错误

这让我相信错误一定是在服务器端——但我不确定哪里或为什么会出错。我完全复制了 Sam 的代码,只更改了必要的内容,例如“News”。

4

3 回答 3

1

您应该使用 RequestFactorys 来解决这个问题。

https://developers.google.com/web-toolkit/doc/latest/DevGuideRequestFactory

使用 RequestFactory,您可以在客户端(andorid 或 gwt-client)上使用代理对象并将其发送回服务器。

检查这个例子: http ://code.google.com/p/cloud-tasks-io/source/browse/trunk/CloudTasks-AppEngine/

这是一个通过 C2dm 上的 RequestFactory 注册的 Andorid 应用程序(推送服务)

于 2012-05-07T11:02:41.883 回答
1

您还可以制作一个简单的 HttpServlet。以下示例返回数据存储区中所有新闻项目的 JSON 字符串...

public class JsonNews extends HttpServlet {

@Override
  protected void doPost(HttpServletRequest req, HttpServletResponse resp)
      throws ServletException, IOException {

        PrintWriter out = resp.getWriter();
        resp.setContentType("application/json");

        //out.write("{news}");

        PersistenceManager pm = Pmf.getPersistenceManager();
        Query q = pm.newQuery(News.class);

        List<News> news = null;
        String retStr="";
        try {
            news = (List<News>) q.execute();
            Gson g = new Gson();
            //retStr = g.toJson(news);
            retStr = "{\"success\": true, \"news\": " + new Gson().toJson(news,new TypeToken<List<News>>() {}.getType()) + '}';

             out.write( retStr);
        } catch (JDOException e) {
            e.printStackTrace();

        } finally {
            q.closeAll();
            pm.close();

        }

  }
}

单例 Pmf 级

public final class Pmf  {
private static final PersistenceManagerFactory pmfInstance =
    JDOHelper.getPersistenceManagerFactory("transactions-optional");

private Pmf() {}


public static PersistenceManager getPersistenceManager() {

    PersistenceManager pm = pmfInstance.getPersistenceManager();

    return pm;


}



}
于 2012-05-07T17:19:22.117 回答
0

这个问题解决了我的确切问题:

如何使用 android 发送一个 json 对象-over-request-with-android

请参阅 dmazzoni 和 primpop 的答案。

于 2012-05-10T10:32:38.093 回答