最近在做接口的调试,用NetHttpClient来进行相关操作。部分数据是用get方法来操作的,没有问题,但有个数据是用Post来操作的,始终报错,用了抓包分析工具发现没有发送数据出去。但找不出代码的问题,请大家帮忙看看。
关键部分代码如下:

procedure TTabbedwithNavigationForm.Button3Click(Sender: TObject);
var joj,jodata:tjsonobject;
jadata:tjsonarray;
ss:tstringstream;
aresponse:ihttpresponse;
begin
.........
ss:=tstringstream.Create('',tencoding.UTF8);
ss.WriteString(jodata.ToString);
showmessage(inttostr(length(jodata.ToString))); nethttpclient1.Accept:='*/*';
nethttpclient1.AcceptEncoding:='gzip,deflate';
nethttpclient1.AcceptLanguage:='zh-CN';
nethttpclient1.UserAgent:='Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko';
nethttpclient1.ContentType:='application/json';
nethttpclient1.CustomHeaders['Authorization']:=au_edit.Text; aresponse:=nethttpclient1.Post(lbltitle4.Text,ss);
memo3.Lines.Add(aresponse.ContentAsString()); ss.Free;
end;

运行代码后返回错误提示如下:
{"timestamp":"2019-06-14 16:53:37","status":400,"error":"Bad Request","exception":"org.springframework.http.converter.HttpMessageNotReadableException","message":"Required request body is missing: public com.qianfan123.sail.inf.service.ResponseResult<java.util.List<com.qianfan123.sail.inf.service.mbr.coupon.v2.CouponVT>> com.qianfan123.sail.inf.server.mbr.coupon.v2.CouponServiceVTImpl.issue(java.lang.String,java.lang.String,java.lang.String,com.qianfan123.sail.inf.service.mbr.coupon.v2.CouponIssueVTDTO)","path":"/api/mbr/v2/coupon/issue"}

通过抓包软件分析获取的正确执行的会话信息如下(*号是屏弊部分):
POST http://**********/api/mbr/v2/coupon/issue HTTP/1.1
Content-Type: application/json
Accept: */*
Authorization: **********
Referer: http://**********/swagger-ui.html
Accept-Language: zh-CN
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko
Content-Length: 366
Host: ****.****.****:6020
Connection: Keep-Alive
Pragma: no-cache

{"event":"string","lines":[{"amount":"1000","beginDate":"2019-06-14 16:02:14","categoryCode":"000275","code":"20190614160214","count":"1","endDate":"2019-06-14 16:02:14"}],"memberId":"135057337785253888","occuredAt":"****","occuredTime":"2019-06-14 16:02:14","orgCode":"****","ownerActivity":"pos","summary":"测试","terminal":"01","transId":"20190614160214"}
HTTP/1.1 200
X-Application-Context: member-inf:10000
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Date: Fri, 14 Jun 2019 08:04:27 GMT

1d7
{"status":"0000","message":"请求成功","data":[{"orgCode":"****","memberId":"******","code":"20190614160214","categoryId":"*****4","categoryCode":"******","name":"TIMTEST","type":"cash","facedAmt":1000,"amount":1000,"effectBegin":"2019-06-14 00:00:00","effectEnd":"2019-06-14 23:59:59","state":"可使用","fixed":true,"discount":null,"storeCode":null,"useLimitAmount":null,"isRegifted":-1,"limitRegiftedNum":null,"remainRegiftedNum":null}]}
0

而错误的抓包信息如下:(*号是屏弊部分)
POST http://*.*.*.*:6020/api/mbr/v2/coupon/issue HTTP/1.1
Content-Type: application/json
Accept: */*
Authorization:**********

Accept-Language: zh-CN
Accept-Encoding: gzip,deflate
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko
Host: *.*.*.*:6020
Content-Length: 0----------
Connection: Keep-Alive

HTTP/1.1 400
X-Application-Context: member-inf:10000
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Date: Fri, 14 Jun 2019 08:21:33 GMT
Connection: close

21f
{"timestamp":"2019-06-14 16:21:33","status":400,"error":"Bad Request","exception":"org.springframework.http.converter.HttpMessageNotReadableException","message":"Required request body is missing: public com.qianfan123.sail.inf.service.ResponseResult<java.util.List<com.qianfan123.sail.inf.service.mbr.coupon.v2.CouponVT>> com.qianfan123.sail.inf.server.mbr.coupon.v2.CouponServiceVTImpl.issue(java.lang.String,java.lang.String,java.lang.String,com.qianfan123.sail.inf.service.mbr.coupon.v2.CouponIssueVTDTO)","path":"/api/mbr/v2/coupon/issue"}
0

分析了下,抓包的差异主要在于错误部分缺少了:
Pragma: no-cache

{"event":"string","lines":[{"amount":"1000","beginDate":"2019-06-14 16:02..........
这段数据。也就是发送部分的数据感觉没有出去。

有个朋友也遇到了跟我一样的问题,结果不是什么body,head的问题,而是那个数据流写入后需要将其Position:=0,即可。如下:

  ss:=tstringstream.Create('',tencoding.UTF8);
ss.WriteString(jodata.ToString);
ss.Position:=;

http://bbs.2ccc.com/topic.asp?topicid=566930,这是原文地址,感谢zhangpuqing分享!

后记:我在10.3.1下测试,当ss.WriteString(jodata.ToString)执行后,Position指向最后一个位置!如果我们在建立对象时,直接传String进去,则Position为0,例如:

  ss:=tstringstream.Create(jodata.ToString,tencoding.UTF8);
//Position现在为0.

那这个问题,按上面的写法也可以,这样更简洁!

用NetHttpClient执行Post操作遇到的问题的更多相关文章

  1. 《Entity Framework 6 Recipes》中文翻译系列 (27) ------ 第五章 加载实体和导航属性之关联实体过滤、排序、执行聚合操作

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 5-9  关联实体过滤和排序 问题 你有一实体的实例,你想加载应用了过滤和排序的相关 ...

  2. SQL Server 存储过程遇到“表 '#TT' 没有标识属性。无法执行 SET 操作”错误

    创建临时表,往临时表插入数据的时候报的错误. 一开始提示没有打开主键,后来打开主键就提示上述错误异常. 从网上查找资料没有找到,然后又到群里问各位大牛,一位大牛告诉我是没有设置主键. 我又仔细看看提示 ...

  3. ThinkPHP 表单提交操作成功后执行JS操作如何刷新父页面或关闭当前页等操作

    ThinkPHP 表单提交操作成功后执行JS操作如何刷新父页面或关闭当前页等操作 .操作成功后刷新父页面 $this->assign('jumpUrl', "javascript:wi ...

  4. 使用MyBatis对表执行CRUD操作

    一.使用MyBatis对表执行CRUD操作——基于XML的实现 1.定义sql映射xml文件 userMapper.xml文件的内容如下: <?xml version="1.0&quo ...

  5. MyBatis学习总结(二)——使用MyBatis对表执行CRUD操作(转载)

    本文转载自:http://www.cnblogs.com/jpf-java/p/6013540.html 上一篇博文MyBatis学习总结(一)--MyBatis快速入门中我们讲了如何使用Mybati ...

  6. C# 集合已修改;可能无法执行枚举操作

    在winform 项目时遇到: 集合已修改;可能无法执行枚举操作的问题 错误原因:当用foreach遍历Collection时,如果对Collection有Add或者Remove或其他类似操作都会有这 ...

  7. Win8开虚拟wifi ‘无法启动承载网络 组或资源的状态不是执行请求操作的正确状态“

    第一步,首先我们点开开始按钮菜单,要右键以“管理员身份”打开CMD“命令提示符”并键入或者复制(粘贴)命令:netsh wlan show drivers 查看本机无线网卡是否支持此项Wifi热点共享 ...

  8. MyBatis入门学习教程-使用MyBatis对表执行CRUD操作

    上一篇MyBatis学习总结(一)--MyBatis快速入门中我们讲了如何使用Mybatis查询users表中的数据,算是对MyBatis有一个初步的入门了,今天讲解一下如何使用MyBatis对use ...

  9. MyBatis学习总结(二)——使用MyBatis对表执行CRUD操作

    一.使用MyBatis对表执行CRUD操作--基于XML的实现 1.定义sql映射xml文件 userMapper.xml文件的内容如下: 1 <?xml version="1.0&q ...

随机推荐

  1. Spring配置文件里加载路径中的通配符

    ?代表匹配任意一个字符            *代表匹配0个或多个任意字符             **/匹配任意多个目录 classpath:app-Beans.xml 查找app-Beans.xm ...

  2. Turbine Netflix

    Turbine是聚合服务器发送事件流数据的一个工具,用来监控集群下hystrix的metrics情况. 本实例是在consul做为服务发现时的配置. Turbine聚合器: 可以参照:https:// ...

  3. Ansible-galera

    在四台虚拟机上都安装好docker 一.控制节点 1. 域名解析 [root@d ansible]# vim /etc/hosts [root@d ansible]# scp /etc/hosts n ...

  4. 在centos卸载mysql

    1 rpm -qa|grep mysql 查看安装了哪些mysql和lib…… 1 yum remove mysql mysql-server mysql-libs compat-mysql51 删除 ...

  5. Java之属性和普通方法

    一.定义类 上一节讲了很多深奥的理论,那么这节我们就得实践一下,先简单描述一下我们的实体世界:有一个学生小明,那么这个学生就是一个对象,这个对象有哪些属性和方法呢,我们可以先简单抽象一下,属性有(姓名 ...

  6. 3.React中的setstate的几个现象

    转载segfault 上面的一篇文章,https://segmentfault.com/a/1190000014498196 1.在同一个方法中多次setState是会被合并的,并且对相同属性的设置只 ...

  7. 【AMAD】django-countries -- 为Django app的form提供country选项,为model提供CountryField

    动机 简介 个人评分 动机 有时候看一些数据库设计,国家数据会存在一个单独的表里面.这种方式读取数据库无疑又要加上一层join,很不划算. 简介 [django-countries]1解决的是: 不用 ...

  8. BiGAN的复现

    数据集是10000个样本,前8000个训练集,后面的用来测试.每个样本是1*144(重构成12*12的矩阵),将原始BiGAN有编码器.判别器和生成器,将里面的全连接层全部替换成了卷积. from _ ...

  9. 【miscellaneous】多播(组播)原理分析

    为什么要使用多播:        网卡从网络上接收到目标物理地址对应的所有bit位都为1的数据报时,会收到这条消息并将其上传给驱动程序,网卡的这种工作模式称为广播模式,网卡的缺省工作模式包含直接模式和 ...

  10. element UI实现动态生成多级表头

    一.效果图 二.封装两个组件,分别为DynamicTable.vue和TableColumn.vue,TableColumn.vue主要是使用递归来对表头进行循环生成 DynamicTable.vue ...