Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 495|回复: 0

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

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-8-30 12:13:37 | 显示全部楼层 |阅读模式

    几个关键字:

    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就可以了. 这么狗血的解决方案.

     

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-12-23 04:25 , Processed in 0.054000 second(s), 28 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表