delphi网络组件ICS的THttpCli和TSslHttpCli如何设置自定义Header
新版本的ics86,有THttpCli和TSslHttpCli两种组件,有个新的属性ExtraHeaders,可以这样写:
http.ExtraHeaders('par1: 11'); //不能写par1:11,要写par1: 11,有个空格
http.ExtraHeaders('par2: 11');
这样提交后,服务端就收到headers了。
注意不能写par1:11,要写par1: 11,有个空格。
分析源码:OverbyteIcsHttpProt,发现有这样一行:
if Pos (': ', FExtraHeaders[N]) > 1 then Headers.Add(FExtraHeaders[N]);
也就是,没有冒号空格的认为无效了。
ICS的优点是多线程,这点比indy方便的多。
//----------------------------------------------------------------------------------//
//开始提交,联网用。TSslHttpCli、TSslContext or (not idHttp is TSslHttpCli) ssl:=TSslHttpCli.create(application)if (assigned(ssl.SslContext)) then sslCnt:=ssl.SslContext else begin sslCnt:=TSslContext.Create(application); ssl.SslContext:=sslCnt; end; //注意,扩展headers必须包含:空格,比如:Authorization: 123,写成Authorization:123不行 ssl.ExtraHeaders.Clear; ssl.ExtraHeaders.Add('Authorization: ' + Authorization); //网址、post流 ssl.ContentTypePost:='application/json'; ssl.URL:=payUrl; //流
PostData := TStringStream.Create('');
PostData.WriteString(ansitoUtf8(jsonTxt)); ssl.SendStream:= postData; postData.Position:=0; ssl.RcvdStream:= TStringStream.Create(''); ssl.Timeout:=60 * 3; //3分钟 writeLogFile(' 移动支付4:时间'+intToStr(ssl.timeout)+',准备post提交', hLogFileHandle); //提交 ssl.Post; //读取响应 writeLogFile(' 移动支付5:应答StatusCode:'+ intToStr(ssl.StatusCode), hLogFileHandle); if ssl.StatusCode <> 200 then begin sErrMsg:=sErrMsg+#13#10'Post提交失败错误: ' + IntToStr(ssl.StatusCode) + ' ' + ssl.ReasonPhrase; writeLogFile(' 移动支付5.2:错误:'+sErrMsg, hLogFileHandle); end else begin ssl.RcvdStream.Seek(0, 0); SetLength(strBuf, ssl.RcvdStream.Size); ssl.RcvdStream.Read(strBuf[1], Length(strBuf)); jsonResult:=trim(string(strBuf)); end; //释放响应流 ssl.RcvdStream.Free; ssl.RcvdStream := nil;
//------------------------------------------------------------------------------------------------------//
好坑。