从Android的Jersey Resftul webservice传递和接收JSON对象

场景:将json对象中的用户名和密码传递给restful webservice并获得一个json对象作为回报。 是的,我知道,它很简单,但我不能让它工作。

几天来我一直在尝试这个。 到目前为止,我试过这个:

我宁静的网络服务代码

@POST @Path("/testJson") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public JSONObject testJson(JSONObject inputJsonObj) throws Exception { JSONObject myjson = new JSONObject(); if(inputJsonObj != null){ System.out.println("================================="); System.out.println("JSON object = " + inputJsonObj.toString()); System.out.println("================================="); } else{ System.out.println("JSON is NULL"); } myjson.put("success", "1"); System.out.println(myjson.toString()); // return "string returned"; return myjson; } 

在我的android acivity中,代码是

 // POST request to /SaveVehicle HttpPost request = new HttpPost(myURL); request.setHeader("Accept", "application/json"); request.setHeader("Content-type", "application/json"); request.setHeader("user-agent", "Yoda"); try { // Build JSON string // JSONStringer vehicle = new JSONStringer().object() // .key("getItInputTO").object().key("zipCode").value("90505") // .key("financingOption").value("B").key("make") // .value("Scion").key("baseAmountFinanced").value("12000") // .key("modelYear").value("2010").key("trimCode") // .value("6221").key("totalMSRP").value("15000") // .key("aprRate").value("").endObject().endObject(); JSONObject myjson = new JSONObject(); myjson.put("1", "first"); myjson.put("2", "second"); StringEntity entity = new StringEntity(myjson.toString()); entity.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE,"application/json; charset=utf-8")); request.setEntity(entity); // Send request to WCF service DefaultHttpClient httpClient = new DefaultHttpClient(); HttpContext localContext = new BasicHttpContext(); // HttpResponse response = httpClient.execute(request, localContext); HttpResponse response = httpClient.execute(request); resCode = response.getStatusLine().getStatusCode(); Toast.makeText(getApplicationContext(), response.getStatusLine().getStatusCode() + "", Toast.LENGTH_LONG).show(); if (resCode == 200) { Toast.makeText(getApplicationContext(), response.getStatusLine().getStatusCode() + "", Toast.LENGTH_LONG).show(); HttpEntity entity2 = (HttpEntity) response.getEntity().getContent(); String text = getASCIIContentFromEntity(entity); if(text!=null){ JSONObject obj = new JSONObject(text); lblMsg.setText("Successful!"); } // BufferedReader in = new BufferedReader(new // InputStreamReader(response.getEntity().getContent())); // // // String line = ""; // StringBuffer returnFromServer = new StringBuffer(); // // while ((line = in.readLine()) != null) { // returnFromServer.append(line); // } // // Toast what we got from server // Toast.makeText(getApplicationContext(), // returnFromServer.toString(), Toast.LENGTH_LONG).show(); // // if (entity != null) { // entity.consumeContent(); // } } } catch (Exception e) { // TODO: handle exception } 

评论部分显示以前的尝试。

我在服务器控制台上获得的输出

 ================================= JSON object = {} ================================= {"success":"1"} 

我的服务器端接收器json对象没有填充,我不知道为什么。

注意:

  1. 我的android清单中有INTERNET和许多其他权限。
  2. 我的网络服务已启动并正在运行。
  3. 我有所有必需的jar子,如泽西,杰森等
  4. 我正在使用Tomcat 7进行安静的Web服务

我非常感谢任何帮助。 谢谢

我和你的问题一样。 我不知道为什么,但我正在使用的临时解决方案是创建一个类来处理这些参数。

这意味着使用jackson转换Json对象<=>“你的class级”

有关更多信息,请参阅本教程: http : //www.mkyong.com/webservices/jax-rs/json-example-with-jersey-jackson/

===================================

我刚刚find这个主题,它可能比上层解决方案更有用: Jersey POST Method接收空值作为参数

也许,回答已经太晚了,但这里是:

  • 首先将POST更改为GET
  • 改变你的@Path
  • 并将@PathParam添加到您的代码中

变化如下:

 @GET @Path("/testJson/{inputJsonObj}") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public JSONObject testJson(@PathParam("inputJsonObj") JSONObject inputJsonObj) throws Exception { ... 

是的,您必须指定资源何时接受参数。

另请注意,一旦更改了请求方法,就需要改变android方式: HttpPost HttpGet使用HttpGet