几个关键字:
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 }
结果:
但是同样的Json, 使用C#的HTTPClient就完全没有问题.
计较了一下fiddle抓图:
使用C# HttpClient: (value是能取到)
使用Java Apache HttpClient (Value取不到)
比较一下就发现, 在Raw视图, 才可以看出, HttpRequest的Body是有不同的. 就是一对引号. "".
所以把Java的代码中加一行:
str ="\"" +str + "\"";
WebAPI端就正常拿到Value了.
估计有更深层次的解决方案, 暂且先记一笔.
>>2015/06/15
把WebAPI的参数value的类型改为object就可以了. 这么狗血的解决方案.
|