最近在做接口的调试,用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. [Ubuntu]18安装navicat 破解版&官方版本

    破解版本: 一.下载破解版的navicat  链接:https://pan.baidu.com/s/1ulptSderoG0EbEQpO3Adww提取码:8oc3 二.解压到桌面 在下载压缩文件之后, ...

  2. WEditor使用方法

    APP的定位方式有: 1. Appium Desktop工具里的Inspector 2. /tools/bin/uiautomatorviewer.bat 最近发现在一个更好用的定位工具: Wedit ...

  3. redis开启持久化、redis 数据备份与恢复

    redis持久化介绍  https://segmentfault.com/a/1190000015897415 1. 开启aof持久化.以守护进程启动.远程访问先把配置文件拷贝一份到/etc/redi ...

  4. git如何从远端获取某个文件

    git fetch git checkout origin/master -- path/folder/filename

  5. js有序数组中插入一个元素,并有序的输出

    题目:比较传入函数的参数,将参数组成数组,从小到大排序,返回新的数组. 如: insert();console.log(arr); //[] insert(-1,-2); console.log(ar ...

  6. Django:(03)请求和响应

    一.HttpRequest 客户端传参的几种方式 传递方式 示例 后端获取方式 数据类型 url路径(path) /news/1/2 正则匹配 str 查询字符串 /news2?category=1& ...

  7. 深入理解C语言-深入理解数组

    数组,作为C语言中常见的复杂数据类型,了解其本质有助于深入了解C语言 数组概念 元素类型角度:数组是相同类型的变量的有序集合测试指针变量占有内存空间大小 内存角度:联系的一大片内存空间 数组初始化 数 ...

  8. Vuecli 3.0 项目自定义添加静态目录,支持在index.html引入

    参考链接:https://blog.csdn.net/qq_15253407/article/details/89491255

  9. IT架构的本质

    老僧三十年前未参禅时,见山是山,见水是水. 及至后来,亲见知识,有个入出,见山不是山,见水不是水. 而今得个休歇处,依前见山只是山,见水只是水. 参禅的三重境界在IT技术圈同样适用,初学者感叹每个产品 ...

  10. 第十三章 字符串 (四)之Scanner类

    一.Scanner简述 Scanner扫描器类本质上是由正则表达式实现的,可以接受任何能产生数据的数据源对象,默认以空白符进行分词(包括\n等),使用各种next方法进行扫描匹配,获取匹配的数据. 二 ...