https和http的post發送總結

本文爲轉貼內容,感謝做者阿進!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;  不然對方收到的長度只有一半。

相關文章
相關標籤/搜索