Je suis sûr que je fais quelque chose de mal ici. J'ai suivi tous les exemples que je peux trouver sur stackoverflow et je n'ai toujours pas réussi à ce que cela fonctionne dans mon environnement. J'aimerais mettre à jour mes contrôles et mon environnement, mais je suis actuellement bloqué avec ce que j'ai.
J'utilise:
Je dois envoyer ce JSON à une URL:
"auth": {
"applicationId": "appID",
"applicationPassword": "pwd",
"accountId": "acct",
"userId": "dev"
}
Il n’ya rien de vraiment fou à ce sujet, mais lorsque j’essaie de publier ma demande, j’ai tendance à recevoir le message que la demande a été fermée de façon élégante. CheckIsReadable dans IDSocketHandle.pas a Handleallocated = false. Je ne suis pas sûr de ce que j'ai fait de mal en configurant mon IdHTTP, mais cela ne fonctionnera tout simplement pas.
J'ai essayé des exemples de toutes ces questions et plusieurs autres, mais aucune de ces approches ne semble fonctionner pour moi:
Tous les conseils seraient grandement appréciés.
La variante actuelle ressemble à ceci:
procedure Tformmaintestbed.btnJSONSendClick(Sender: TObject);
var
code: Integer;
sResponse: string;
JsonToSend: TStringStream;
begin
JsonToSend := TStringStream.Create(
'{"auth": {"applicationId": "' + edApplication.text +
'","applicationPassword": "' + edpassword.text +
'","accountId": "' + edaccount.text +
'","userId": "' + edUser.text +
'"}}');
try
HTTP1.Request.ContentType := 'application/json';
HTTP1.Request.ContentEncoding := 'utf-8';
memoRequest.lines.clear;
memoRequest.lines.add(JsonToSend);
try
sResponse := HTTP1.Post(cbAddress.text, JsonToSend);
except
on E: Exception do
ShowMessage('Error on request: '#13#10 + e.Message);
end;
memoResponse.lines.clear;
memoresponse.lines.add(sResponse);
finally
JsonToSend.Free();
end;
end;
Le composant idHTTP est actuellement défini comme ceci:
object HTTP1: TIdHTTP
IOHandler = IdSSLIOHandlerSocketOpenSSL1
AuthRetries = 0
AuthProxyRetries = 0
AllowCookies = True
HandleRedirects = True
ProxyParams.BasicAuthentication = False
ProxyParams.ProxyPort = 0
Request.ContentEncoding = 'utf-8'
Request.ContentLength = -1
Request.ContentRangeEnd = 0
Request.ContentRangeStart = 0
Request.ContentRangeInstanceLength = 0
Request.ContentType = 'application/json'
Request.Accept = 'application/json'
Request.BasicAuthentication = False
Request.UserAgent = 'Mozilla/3.0 (compatible; Indy Library)'
HTTPOptions = [hoForceEncodeParams]
Left = 564
Top = 120
end
HTTP1.Request.ContentEncoding
devrait être HTTP1.Request.CharSet
à la place. UTF-8 est un encodage de jeu de caractères, pas un encodage de contenu. Ensuite, assurez-vous que vos données JSON sont bien encodées au format UTF-8 avant de les publier. Si vous utilisez des caractères ASCII, le code TStringStream
que vous avez indiqué est correct. Mais si vous utilisez des caractères non-ASCII, vous devez les encoder, comme avec Utf8Encode()
. TIdHTTP
ne code pas les données TStream
, elles sont envoyées telles quelles.
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;
Alternativement:
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;
S'il vous plaît essayez ceci:
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;