I am sure I\'m doing something wrong here. I\'ve followed every example I can find on stackoverflow and still haven\'t gotten this to work in my environment. I\'d love to up
HTTP1.Request.ContentEncoding
should be HTTP1.Request.CharSet
instead. UTF-8 is a charset encoding, not a content encoding. And then make sure your JSON data is actually encoded to UTF-8 before posting it. If you are using ASCII characters, the TStringStream
code you showed is fine. But if you are using non-ASCII Characters, you need to encode them, such as with Utf8Encode()
. TIdHTTP
does not encode TStream
data, it is sent as-is.
Procedure Tformmaintestbed.btnJSONSendClick(Sender: TObject);
var
Json: string;
sResponse: string;
JsonToSend: TStringStream;
begin
Json := '{"auth": {"applicationId": "' + edApplication.text +
'","applicationPassword": "' + edpassword.text +
'","accountId": "' + edaccount.text +
'","userId": "' + edUser.text +
'"}}';
memoRequest.Text := Json;
JsonToSend := TStringStream.Create(Utf8Encode(Json)); // D2007 and earlier only
//in D2009 and later, use this instead:
//JsonToSend := TStringStream.Create(Json, TEncoding.UTF8);
try
HTTP1.Request.ContentType := 'application/json';
HTTP1.Request.CharSet := 'utf-8';
try
sResponse := HTTP1.Post(cbAddress.Text, JsonToSend);
except
on E: Exception do
ShowMessage('Error on request: '#13#10 + e.Message);
end;
finally
JsonToSend.Free;
end;
memoResponse.Text := sResponse;
end;
Alternatively:
Procedure Tformmaintestbed.btnJSONSendClick(Sender: TObject);
var
Json: string;
sResponse: string;
JsonToSend: TMemoryStream;
begin
Json := '{"auth": {"applicationId": "' + edApplication.text +
'","applicationPassword": "' + edpassword.text +
'","accountId": "' + edaccount.text +
'","userId": "' + edUser.text +
'"}}';
memoRequest.Text := Json;
JsonToSend := TMemoryStream.Create;
try
WriteStringToStream(JsonToSend, Json, enUTF8);
JsonToSend.Position := 0;
HTTP1.Request.ContentType := 'application/json';
HTTP1.Request.CharSet := 'utf-8';
try
sResponse := HTTP1.Post(cbAddress.Text, JsonToSend);
except
on E: Exception do
ShowMessage('Error on request: '#13#10 + e.Message);
end;
finally
JsonToSend.Free;
end;
memoResponse.Text := sResponse;
end;
Please try this:
procedure TForm1.Button1Click(Sender: TObject);
var
s: String;
Resp_Json: string;
Req_Json:TStream;
begin
s:='state=1';
s:=s+'&kind=0';
s:=s+'&tblid=0';
Req_Json:=TstringStream.Create(s);
Req_Json.Position:=0;
try
IdHTTP1.Request.UserAgent:='Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36';
IdHTTP1.Request.Accept := 'application/json, text/javascript, */*; q=0.01';
IdHTTP1.Request.ContentType := 'application/x-www-form-urlencoded; charset=UTF-8';
IdHTTP1.Request.CharSet:='utf-8';
Resp_Json:=IdHTTP1.Post('http://[your URL]', Req_Json);
finally
Req_Json.Free;
end;
memo1.Lines.Add(IdHTTP1.ResponseText);
memo1.Lines.Add(Resp_Json);
end;