使用Java HttpComponent/HttpClinet 调用 WebAPI问题的解决

几个关键字:

WebAPI, Android, Apache HttpComponent/HttpClient

问题:无论怎么测试, WebAPI的FormBody value总是空.

 

最简单的代码 WebAPI, 没有加认证

 1 // POST api/<controller>
 2 [HttpPost]
 3 public string Post([FromBody]string value)
 4 {
 5     string val = value;
 6 
 7     Debug.WriteLine(value);
 8 
 9     return value;
10 }

 

最简单的代码, Java端,用StringEntity

 1     public static void NotAuthTestPost() throws IOException {
 2         CloseableHttpClient httpclient = HttpClients.createDefault();
 3         try {
 4             HttpPost hp = new HttpPost("http://localhost:8888/api/test");
 5             
 6             String str="{'Header':[{'summary':111,'endtime':570,'end_date':1431381600,'resid':'sc20150512034635','starttime':570,'scheduleid':'sc155485e5025f3d','machid':'sc155485e8044b93','parentid':null,'start_date':1431381600}],'Detail':[{'perm_modify':1,'owner':1,'perm_delete':1,'resid':'sc20150512034635','memberid':'sc1555070e4d8217','invited':0},{'perm_modify':0,'owner':0,'perm_delete':0,'resid':'sc20150512034635','memberid':'sc155489a07e0e24','invited':1}]}";
 7  8             StringEntity se = new StringEntity(str, ContentType.create("application/json", "UTF-8"));
 9             hp.setEntity(se);
10 
11             System.out.println(EntityUtils.toString(se));
12 
13             CloseableHttpResponse response1 = null;
14             try {
15                 response1 = httpclient.execute(hp);
16 
17                 System.out.println(response1.getStatusLine());
18                 HttpEntity entity1 = response1.getEntity();
19 
20                 // do something useful with the response body
21                 // and ensure it is fully consumed
22                 // EntityUtils.consume(entity1);
23 
24                 String jsonstr = EntityUtils.toString(entity1);
25 
26                 System.out.println(jsonstr);
27 
28             } catch (ClientProtocolException e) {
29                 e.printStackTrace();
30             } catch (IOException e) {
31                 e.printStackTrace();
32             } finally {
33                 response1.close();
34             }
35 
36         } finally {
37             httpclient.close();
38         }
39     }

 

结果:

使用Java HttpComponent/HttpClinet 调用 WebAPI问题的解决

 

但是同样的Json, 使用C#的HTTPClient就完全没有问题.

计较了一下fiddle抓图:

使用C# HttpClient: (value是能取到)

使用Java HttpComponent/HttpClinet 调用 WebAPI问题的解决

 

使用Java Apache HttpClient (Value取不到)

使用Java HttpComponent/HttpClinet 调用 WebAPI问题的解决

 

比较一下就发现, 在Raw视图, 才可以看出, HttpRequest的Body是有不同的. 就是一对引号. "".

 

所以把Java的代码中加一行:

str ="\"" +str + "\"";

 

WebAPI端就正常拿到Value了.

 

估计有更深层次的解决方案, 暂且先记一笔.

 

>>2015/06/15

把WebAPI的参数value的类型改为object就可以了. 这么狗血的解决方案.