本文為轉貼內容,感謝作者阿進!
需要轉發數據到客戶的https的服務器上出現一系列問題總結如下:
1.因為是https首先考慮到用最新的控件NetHTTPClient(只有在XE8以上才有)。
2.客戶的服務器需要先登錄
例如:域名/authentication?account=admin&password=001
Method: POST
return:
200:成功
404:不存在
606:自定義錯誤
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; 否則對方收到的長度只有一半。