【问题标题】:POST request from Android to Restful API从 Android 到 Restful API 的 POST 请求
【发布时间】:2015-04-11 00:51:58
【问题描述】:

我是一个自学的 android 学习者。从事一个简单的企业 Android 项目。需要帮助吗?

项目:

Backend - Restful Web Service running on Tomcat. It has an insertMethod which takes a Java Object as an argument. The Method is as follows:
@RequestMapping(value = "/project/insert", method = RequestMethod.POST)
    public @ResponseBody void insertProject(@RequestBody ProjectDTO proj)
    {
            ser.addProject(proj);
    }

ProjectDTO 是一个 POJO。

我需要从 Android 调用 Restful API 的这个方法。我所做的所有研究都建议使用 JSON。

我需要持久化 POJO 的所有字段。这就是我创建 POJO 的原因。现在,我想重用这个 POJO 并将其作为参数传递给 HttpPost 客户端。但是,我无法在网上获得任何简单的解决方案。

我正在使用以下代码来调用网络服务:

HttpClient httpClient = new DefaultHttpClient();
        HttpPost post = new HttpPost("http://localhost:8080/Project-100/user/java/insert");
        post.setHeader("content-type", "application/json");

        JSONObject data = new JSONObject();
        try {
            data.put("first_name", f_name);
            data.put("last_name", l_name);
            data.put("email", em);
            StringEntity entity = new StringEntity(data.toString());
            post.setEntity(entity);
            HttpResponse resp = httpClient.execute(post);
}

收到以下错误:03-31 01:22:26.245: E/AndroidRuntime(2195): java.lang.IllegalStateException: 不能 活动的执行方法 03-31 01:22:26.245: E/AndroidRuntime(2195):在 android.view.View$1.onClick(View.java:4020) 03-31 01:22:26.245: E/AndroidRuntime(2195):在 android.view.View.performClick(View.java:4780) 03-31 01:22:26.245: E/AndroidRuntime(2195):在 android.view.View$PerformClick.run(View.java:19866) 03-31 01:22:26.245:E/AndroidRuntime(2195):在 android.os.Handler.handleCallback(Handler.java:739) 03-31 01:22:26.245:E/AndroidRuntime(2195):在 android.os.Handler.dispatchMessage(Handler.java:95) 03-31 01:22:26.245:E/AndroidRuntime(2195):在 android.os.Looper.loop(Looper.java:135) 03-31 01:22:26.245: E/AndroidRuntime(2195):在 android.app.ActivityThread.main(ActivityThread.java:5257) 03-31 01:22:26.245:E/AndroidRuntime(2195):在 java.lang.reflect.Method.invoke(本机方法)03-31 01:22:26.245: E/AndroidRuntime(2195):在 java.lang.reflect.Method.invoke(Method.java:372) 03-31 01:22:26.245: E/AndroidRuntime(2195):在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 03-31 01:22:26.245: E/AndroidRuntime(2195): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 03-31 01:22:26.245: E/AndroidRuntime(2195): 由: java.lang.reflect.InvocationTargetException 03-31 01:22:26.245: E/AndroidRuntime(2195): 在 java.lang.reflect.Method.invoke(Native 方法) 03-31 01:22:26.245: E/AndroidRuntime(2195): at java.lang.reflect.Method.invoke(Method.java:372) 03-31 01:22:26.245: E/AndroidRuntime(2195):在 android.view.View$1.onClick(View.java:4015) 03-31 01:22:26.245: E/AndroidRuntime(2195): ... 10 更多 03-31 01:22:26.245: E/AndroidRuntime(2195):由以下原因引起: android.os.NetworkOnMainThreadException 03-31 01:22:26.245: E/AndroidRuntime(2195):在 android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1147) 03-31 01:22:26.245: E/AndroidRuntime(2195): 在 java.net.InetAddress.lookupHostByName(InetAddress.java:418) 03-31 01:22:26.245:E/AndroidRuntime(2195):在 java.net.InetAddress.getAllByNameImpl(InetAddress.java:252) 03-31 01:22:26.245:E/AndroidRuntime(2195):在 java.net.InetAddress.getAllByName(InetAddress.java:215) 03-31 01:22:26.245:E/AndroidRuntime(2195):在 org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:142) 03-31 01:22:26.245: E/AndroidRuntime(2195): 在 org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:169) 03-31 01:22:26.245: E/AndroidRuntime(2195): 在 org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:124) 03-31 01:22:26.245: E/AndroidRuntime(2195): 在 org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:365) 03-31 01:22:26.245: E/AndroidRuntime(2195): 在 org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:560) 03-31 01:22:26.245: E/AndroidRuntime(2195): 在 org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:492) 03-31 01:22:26.245: E/AndroidRuntime(2195): 在 org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:470) 03-31 01:22:26.245: E/AndroidRuntime(2195): 在 com.manek.collaborationandroid.activity.SignUp.createUser(SignUp.java:70) 03-31 01:22:26.245: E/AndroidRuntime(2195): ... 13 更多 03-31 01:22:26.280: I/art(2195): 背景粘性并发标记扫描 GC 释放 5605(279KB) AllocSpace 对象,0(0B) LOS 对象,26% 空闲, 956KB/1307KB,暂停15.142ms共31.686ms

【问题讨论】:

标签: android json rest post parameters


【解决方案1】:
  //sending Data

   HttpClient httpClient = new DefaultHttpClient();

      HttpPost httpPost = new HttpPost("Your URL");

    List<NameValuePair> nameValuePair = new ArrayList<NameValuePair>();
    nameValuePair.add(new BasicNameValuePair("KEY", VALUE));

    //Encoding POST data
    try {
          httpPost.setEntity(new UrlEncodedFormEntity(nameValuePair));

    } 
          catch (UnsupportedEncodingException e) 

         {
       e.printStackTrace();
    }

    try {

        HttpResponse response = httpClient.execute(httpPost);
     }

您的网址 - 您要发送数据的网址。

KEY - 用于发送数据的标签。(将数据保存在标签内)

VALUE - 您发送的值。

如果您要发送多个数据,请复制代码

nameValuePair.add(new BasicNameValuePair("KEY", VALUE));用你的标签和价值

【讨论】:

  • @Manek Kooner 试试这个
  • 我听从了你的指示。我的 Pojo 有 3 个字段,即名字、姓氏和电子邮件。所以我添加了三个nameValuePairs。这仍然不起作用。
【解决方案2】:

我按照 Hephze 的说明进行操作,现在出现以下错误。

我的 1 个基本问题是我的 Pojo 有 3 个字段。 Restful 函数需要一个 Pojo。但是,在 Android 客户端,我们传递的是 NameValuePair 实体。 Restful API 将如何解释它?有没有办法将 Pojo 作为参数传递?

04-11 13:12:30.953: E/AndroidRuntime(1965): java.lang.IllegalStateException: Could not execute method of the activity
04-11 13:12:30.953: E/AndroidRuntime(1965):     at android.view.View$1.onClick(View.java:4020)
04-11 13:12:30.953: E/AndroidRuntime(1965):     at android.view.View.performClick(View.java:4780)
04-11 13:12:30.953: E/AndroidRuntime(1965):     at android.view.View$PerformClick.run(View.java:19866)
04-11 13:12:30.953: E/AndroidRuntime(1965):     at android.os.Handler.handleCallback(Handler.java:739)
04-11 13:12:30.953: E/AndroidRuntime(1965):     at android.os.Handler.dispatchMessage(Handler.java:95)
04-11 13:12:30.953: E/AndroidRuntime(1965):     at android.os.Looper.loop(Looper.java:135)
04-11 13:12:30.953: E/AndroidRuntime(1965):     at android.app.ActivityThread.main(ActivityThread.java:5257)
04-11 13:12:30.953: E/AndroidRuntime(1965):     at java.lang.reflect.Method.invoke(Native Method)
04-11 13:12:30.953: E/AndroidRuntime(1965):     at java.lang.reflect.Method.invoke(Method.java:372)
04-11 13:12:30.953: E/AndroidRuntime(1965):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
04-11 13:12:30.953: E/AndroidRuntime(1965):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
04-11 13:12:30.953: E/AndroidRuntime(1965): Caused by: java.lang.reflect.InvocationTargetException
04-11 13:12:30.953: E/AndroidRuntime(1965):     at java.lang.reflect.Method.invoke(Native Method)
04-11 13:12:30.953: E/AndroidRuntime(1965):     at java.lang.reflect.Method.invoke(Method.java:372)
04-11 13:12:30.953: E/AndroidRuntime(1965):     at android.view.View$1.onClick(View.java:4015)
04-11 13:12:30.953: E/AndroidRuntime(1965):     ... 10 more
04-11 13:12:30.953: E/AndroidRuntime(1965): Caused by: android.os.NetworkOnMainThreadException
04-11 13:12:30.953: E/AndroidRuntime(1965):     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1147)
04-11 13:12:30.953: E/AndroidRuntime(1965):     at java.net.InetAddress.lookupHostByName(InetAddress.java:418)
04-11 13:12:30.953: E/AndroidRuntime(1965):     at java.net.InetAddress.getAllByNameImpl(InetAddress.java:252)
04-11 13:12:30.953: E/AndroidRuntime(1965):     at java.net.InetAddress.getAllByName(InetAddress.java:215)
04-11 13:12:30.953: E/AndroidRuntime(1965):     at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:142)
04-11 13:12:30.953: E/AndroidRuntime(1965):     at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:169)
04-11 13:12:30.953: E/AndroidRuntime(1965):     at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:124)
04-11 13:12:30.953: E/AndroidRuntime(1965):     at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:365)
04-11 13:12:30.953: E/AndroidRuntime(1965):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:560)
04-11 13:12:30.953: E/AndroidRuntime(1965):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:492)
04-11 13:12:30.953: E/AndroidRuntime(1965):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:470)
04-11 13:12:30.953: E/AndroidRuntime(1965):     at com.manek.collaborationandroid.activity.SignUp.createUser(SignUp.java:82)
04-11 13:12:30.953: E/AndroidRuntime(1965):     ... 13 more

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-30
    • 2015-01-26
    • 2018-07-05
    • 2023-03-14
    • 1970-01-01
    • 2021-03-11
    • 1970-01-01
    相关资源
    最近更新 更多