本文爲轉貼內容,感謝做者阿進!json
須要轉發數據到客戶的https的服務器上出現一系列問題總結以下:服務器
1.由於是https首先考慮到用最新的控件NetHTTPClient(只有在XE8以上纔有)。網絡
2.客戶的服務器須要先登陸session
例如:域名/authentication?account=admin&password=001app
Method: POST測試
return:spa
200:成功code
404:不存在orm
606:自定義錯誤blog
3.登陸成功後須要向下面地址提交json數據
URL:域名/measVals/batch
Method:POST
4.代碼
var Jsonstr:ansistring; Url,ResData:string; ResponseStream:TStringStream; resStr:integer; HTTPRespone:IHTTPResponse;//THTTPResponse; ss : TMemoryStream; begin NetHTTPClient1.AllowCookies:=true; with NetHTTPClient1 do begin //AcceptCharSet := 'utf-8'; ConnectionTimeout := 2000; // 2秒 ResponseTimeout := 10000; // 10秒 AcceptEncoding := 'UTF-8'; AcceptEncoding := '65001'; AcceptLanguage := 'zh-CN'; ContentType := 'application/json; charset=utf-8';//'multipart/form-data';//'application/json'; // UserAgent := 'Embarcadero URI Client/1.0'; //UserAgent := 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727)';//'Embarcadero URI Client/1.0'; end; ResponseStream := TStringStream.Create; ss := TMemoryStream.Create(); //登陸 Url:='https://域名.com/platform/authentication?account=admin&password=001'; HTTPRespone:=NetHTTPClient1.Post(Url,ss,ResponseStream); memo1.Lines.Add(ResponseStream.DataString); //提交數據 Url:='https://域名.com/platform/measVals/batch'; Jsonstr:='{"tourId":"0","st":"MOBILE","mu":[{"num":"12345678","man":"test",'+ '"med":"07", "ver":"0","measCur":[ { "time":"1555050716", "volume": { "unit":"m",'+ '"value":"13" } }] }] }'; ss.Write(Jsonstr[1], Length(Jsonstr)); ss.Position := 0; resStr:=NetHTTPClient1.Post(Url,ss,ResponseStream).StatusCode; memo1.Lines.Add(ResponseStream.DataString); end;
5.須要注意的問題
(1)由於本例中登陸後須要記錄session,開始測試用的dXE10.1,始終記錄不了session,後來查了網絡知道是該版本的bug,後來換用最新的XE10.3才能夠NetHTTPClient1.AllowCookies:=true;
(2)提交json數據開始用TStringStream向對方提交數據,對方始終收到的是空,後來改用TMemoryStream才能夠收到,而且json數據要用Jsonstr:ansistring; 不然對方收到的長度只有一半。