The Indy (Internet Direct) TIdHTTP now creates a default SSLIOHandler when requesting an HTTPS url. This makes TIdHTTP a little easier to use “out of the box”. (blog article).
The code below sends a hard-coded JSON object as POST body to a secure url. Note: if you need to customize the SSLVersions used, or specify certificates/keys, or use status/password event handlers, then you will still have to explicitly assign an SSLIOHandler component to the TIdHTTP.IOHandler property before sending an HTTPS request.
program JSONPostExample; {$APPTYPE CONSOLE} uses IdHTTP, IdGlobal, SysUtils, Classes; var HTTP: TIdHTTP; RequestBody: TStream; ResponseBody: string; begin HTTP := TIdHTTP.Create; try try RequestBody := TStringStream.Create('{"日本語":42}', TEncoding.UTF8); try HTTP.Request.Accept := 'application/json'; HTTP.Request.ContentType := 'application/json'; ResponseBody := HTTP.Post('https://httpbin.org/post', RequestBody); WriteLn(ResponseBody); WriteLn(HTTP.ResponseText); finally RequestBody.Free; end; except on E: EIdHTTPProtocolException do begin WriteLn(E.Message); WriteLn(E.ErrorMessage); end; on E: Exception do begin WriteLn(E.Message); end; end; finally HTTP.Free; end; ReadLn; ReportMemoryLeaksOnShutdown := True; end.
Notes:
- line 16: you must not use a TStringList for the POST body. That version of
TIdHTTP.Post()
formats the data according to theapplication/x-www-form-urlencoded
media type, which is not appropriate for JSON and will corrupt it. - line 17: make sure you encode the JSON body as UTF-8
- line 21: Indy will create a SSLIOHander for a URL beginning with https
Program output:
{ "args": {}, "data": "{\"\u65e5\u672c\u8a9e\":42}", "files": {}, "form": {}, "headers": { "Accept": "application/json", "Accept-Encoding": "identity", "Content-Length": "16", "Content-Type": "application/json", "Host": "httpbin.org", "User-Agent": "Mozilla/3.0 (compatible; Indy Library)" }, "json": { "\u65e5\u672c\u8a9e": 42 }, "origin": "*.*.*.*", "url": "https://httpbin.org/post" } HTTP/1.1 200 OK
Hi! i am using Delphi Rio and Indy component to access a wordpress site through rest api.
Delete procedure ask me to have force=true parameter set.
How can i send that parameter with the delete?
Thanks!
There are many different ways to specifiy a parameter for a HTTP POST request, so you may have to read the WordPress API documentation to see which way to send this parameters is expected.