Delphi HTTP Post JSON
Je suis sûr que je suis en train de faire 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 à faire ce travail dans mon environnement. J'aimerais mettre à jour mon contrôles et de l'environnement, mais je suis actuellement enfermée avec ce que j'ai.
Je suis en utilisant:
- Delphi 7
- Indy 10.0.52
- ulkJSON.pas v1.07
J'ai besoin d'envoyer ce JSON à l'adresse URL suivante:
"auth": {
"applicationId": "appID",
"applicationPassword": "pwd",
"accountId": "acct",
"userId": "dev"
}
Il n'y a pas quelque chose de terriblement fou à ce sujet, mais quand j'essaie de poster ma demande, j'ai tendance à obtenir un message indiquant que la demande a été Fermée Correctement. CheckIsReadable dans IDSocketHandle.pas a Handleallocated = false. Je ne suis pas sûr de ce que j'ai fait de mal dans la configuration de ma IdHTTP, mais il juste ne fonctionnera pas.
J'ai essayé des exemples de toutes ces questions et à plusieurs autres, mais aucune de ces approches semblent fonctionner pour moi:
- Post données JSON à RESTful serveur datasnap de delphes client
- L'envoi d'un JSON codé objet à l'aide d'Indy et Delphi
- Delphi TIdhttp Post JSON?
- Delphi TIdhttp Post JSON?
- Quelle est la façon la plus simple d'appeler Http POST url à l'aide de Delphi?
Des 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;
La idHTTP composant est courant de définir comme suit:
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
1) JSON est juste une chaîne de texte: Tidhttp devrait fonctionner correctement, 2), Vous devriez probablement "content-type" dans l'en-tête HTTP "text/json" ou "application/json", 3) Vous devriez certainement utiliser un outil comme Wireshark ou Fiddler2 pour voir si votre JSON envoi, et comment (ou si) le serveur répond.
S'il vous plaît montrer le code qui ne fonctionne pas pour vous. Ne vous contentez pas de nous orienter à regarder les autres exemples. Montrer le code que VOUS utilisez réellement. Il est probable que vous n'avez pas intégrer ces exemples dans votre projet correctement.
J'ai défini le type de contenu pour correspondre aux exemples présentés dans les postes. Il y aura une réponse JSON message que je peut l'analyser pour obtenir un jeton. Ce jeton peut ensuite être utilisé pour faire d'autres appels pour le site. Avec un violon cours d'exécution pas de messages ont montré pour moi. On dirait que je ne suis pas à même de recevoir un message.
Si vous voulez de l'aide avec votre code qui ne fonctionne pas, il est important que vous poste le code qui ne fonctionne pas. Il est également difficile de dire ce que vous avez fait de mal à "configuration de votre IdHTTP" quand vous ne vous montrez pas comment vous configurez. Si vous voulez de l'aide ici, vous devez inclure les informations pertinentes. Il est inutile de nous demander de spéculer sur ce qui pourrait être mal, quand vous pouvez inclure ce que vous faites et nous pouvons essayer et spécifiquement de vous aider. Veuillez modifier votre question et y ajouter les informations là où il peut être correctement formaté et les gens peuvent facilement trouver. Merci.
OriginalL'auteur Jared Sherman | 2014-06-03
Vous devez vous connecter pour publier un commentaire.
HTTP1.Request.ContentEncoding
devrait êtreHTTP1.Request.CharSet
à la place. UTF-8 est un encodage de caractères, pas un encodage du contenu. Et puis assurez-vous que vos données JSON est en fait codé en UTF-8 avant de le poster. Si vous êtes à l'aide de caractères ASCII, laTStringStream
code vous a montré est très bien. Mais si vous utilisez des Caractères non-ASCII, vous devez encoder eux, comme avecUtf8Encode()
.TIdHTTP
ne codent pasTStream
de données, il est envoyé comme-est.Sinon:
10.0.52 est une TRÈS vieille version. La version actuelle est 10.6.0. Comme pour le
IOHandler
erreur, qui ne se produit que si vous demandez une url HTTPS et ne pas avoir un SSL IOHandler attribué. Cette exigence est encore vrai dans la dernière version.Le
CharSet
propriété a été ajoutée dans la version 10.5.7 de retour en 2010.Si je peux convaincre mon travail de mise à niveau Indy savez-vous si l'un des version avez des problèmes avec Delphi 7? Je vois sur leur dev instantané de la page qu'il existe une version peu de 10.6.0 Indy 10.6.0 - XE6 RTM/ Indy 10.6.0 - XE5 RTM/ Indy 10.6.0 - XE4 RTM/ Indy 10.5.8 - XE2 RTM/ Indy 10.5.7 - XE RTM/ Indy 10.5.5 - RS2010 RTM/
Ceux sont des balises, donc nous savons ce qui SVN revision de Indy a été livré avec chaque grand Delphi de presse au cours des dernières années. Indy se prend toujours en charge de Delphi versions qui va tout le chemin du retour à Delphi 5.
OriginalL'auteur Remy Lebeau
Veuillez essayer ceci:
OriginalL'auteur asep