【问题标题】:Using POST to send data from Android to AppEngine Datastore使用 POST 将数据从 Android 发送到 AppEngine Datastore
【发布时间】:2012-05-15 20:18:21
【问题描述】:

对不起,如果这是一个简单的问题,但我无法弄清楚我应该做什么,而且我认为我在这里有点超出我的深度。我想将数据从 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 应用程序的 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”。

【问题讨论】:

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


    【解决方案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 应用程序

    【讨论】:

    • 谢谢,我在搜索时也遇到了这个问题,但它似乎比我需要做的要复杂得多。我宁愿只使用 doPost(),因为我没有太多时间来实现这个解决方案。但是,如果没有更简单的方法,我准备使用它。
    【解决方案2】:

    你也可以制作一个简单的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;
    
    
    }
    
    
    
    }
    

    【讨论】:

    • 嗨,很抱歉花了这么长时间才回复这个问题。我已经编辑了我的问题以显示我是如何开始实施您的答案的,但是我遇到了一个问题。我认为这不是一个大问题,可能只是我缺乏经验。如果您有时间可以快速浏览一下,我将不胜感激。感谢您迄今为止的所有帮助!
    • 我设法让它工作。不过感谢您的帮助,您让我走上了正轨!
    【解决方案3】:

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

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

    查看 dmazzoni 和 primpop 的答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-30
      • 2019-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多