使用POST将数据从Android发送到AppEngine数据存储区

时间:2012-05-07 10:02:18

标签: java android google-app-engine http datastore

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

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

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

基本上,我的移动应用程序必须能够像我的AppEngine应用程序w.r.t一样。数据检索/写作。

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

非常感谢任何指向正确方向的指针!

编辑:

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

在我的GAE-app的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的代码,只更改了“新闻”等必要的内容。

3 个答案:

答案 0 :(得分: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/

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

答案 1 :(得分: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();

        }

  }
}

Singleton Pmf-Class

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;


}



}

答案 2 :(得分:0)

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

how-to-send-a-json-object-over-request-with-android

请参阅dmazzoni和primpop的答案。