I am trying to use XE7 to connect to an in-house REDCap server. REDCap has a detailed description of the API at https://education.arcus.chop.edu/redcap-api/ and a test server at https://bbmc.ouhsc.edu/redcap/api with a test token key. There is assistance at https://mran.microsoft.com/snapshot/2015-08-18/web/packages/REDCapR/vignettes/TroubleshootingApiCalls.html in R.
I can connect to the test site with Curl and PostMan. My problem is how to implement this in Delphi with SSL.
The Curl script from PostMan:
curl --location 'https://bbmc.ouhsc.edu/redcap/api/' \--data-urlencode 'token=9A81268476645C4E5F03428B8AC3AA7B' \--data-urlencode 'content=record' \--data-urlencode 'action=export' \--data-urlencode 'format=csv' \--data-urlencode 'rawOrLabel=label'
After much searching, this is my Delphi code. What have I missed? IdLogFile1
is a component on the form.
function TForm1.IdSSLIOHandlerSocketOpenSSL1VerifyPeer(Certificate: TIdX509; AOk: Boolean; ADepth, AError: Integer): Boolean;begin showmessage('at IOhandler'); Result := true; // always returns trueend;procedure TForm1.idHTTP2BtnClick(Sender: TObject);var post : string; Params : TStringList; idHTTP : TIdHTTP; SSL1 : TIdSSLIOHandlerSocketOpenSSL; status : integer; response : TstringStream;begin params := TStringList.Create; idHTTP := TIdHTTP.Create(nil); SSL1 := TIdSSLIOHandlerSocketOpenSSL.Create(idHTTP); response := TstringStream.create; SSL1.SSLOptions.Mode := sslmClient ; SSL1.SSLOptions.SSLVersions := [sslvTLSv1, sslvTLSv1_1, sslvTLSv1_2 ];// [ sslvSSLv3, sslvSSLv23,sslvSSLv2, sslvTLSv1, sslvTLSv1_1, sslvTLSv1_2]; SSL1.SSLOptions.VerifyDepth := 0; SSL1.OnVerifyPeer := IdSSLIOHandlerSocketOpenSSL1VerifyPeer; SSL1.SSLOptions.VerifyMode := [ ]; idHTTP.IOHandler := SSL1; memo1.Lines.clear; idHTTP.ReadTimeout := 3000; idHTTP.ConnectTimeout := 3000; idHttp.Request.BasicAuthentication := false; try idHTTP.HandleRedirects := true; idHTTP.Intercept := IdLogFile1; IdLogFile1.Active := true; IdHttp.Request.CustomHeaders.Clear; IdHttp.Request.CustomHeaders.Values['token'] := '9A81268476645C4E5F03428B8AC3AA7B'; IdHttp.Request.CustomHeaders.Values['content'] := 'record'; IdHttp.Request.CustomHeaders.Values['action'] := 'export'; IdHttp.Request.CustomHeaders.Values['format'] := 'csv'; IdHttp.Request.CustomHeaders.Values['rawOrLabel'] := 'label'; IdHttp.Request.CustomHeaders.Values['verify_ssl'] := 'false'; IdHttp.Request.CustomHeaders.Values['ssl_verify'] := 'false'; //various verify options ? IdHttp.Request.CustomHeaders.Values['ssl_verifypeer'] := 'false'; idHTTP.Request.ContentType := 'application/x-www-form-urlencoded'; IdHTTP.Request.Charset := 'utf-8'; idHTTP.HTTPOptions := [hoKeepOrigProtocol, hoForceEncodeParams]; idHTTP.Post('https://bbmc.ouhsc.edu/redcap/api/', params, response ); finally memo1.Lines.add(''); memo1.lines.add(idHTTP.ResponseText); memo1.Lines.add(''); status := idHTTP.ResponseCode; memo1.Lines.Add('code: '+ inttostr(status)); idhttp.Disconnect; end; Params.Free; SSL1.Free; idHTTP.Free; response.Free;end;