用NetHttpClient執行Post操作遇到的問題


最近在做接口的調試,用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:=0;

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.

 

那這個問題,按上面的寫法也可以,這樣更簡潔!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM