Du hast da ein paar Fehler in deinem Code
- Erzeugte Instanzen werden nicht freigegeben
- Dem TJSONObject
wird nichts übergeben, aber das benutzt du als Parameter
- Die reine Instanz von TJSONObject
kann nicht automatisch in einen String konvertiert werden - da meckert schon der Compiler (freundliche Menschen geben das im Post gleich an, dass der Quellcode noch nicht mal kompiliert)
- Das abenteuerliche TIdURI.UrlEncode
wendest du nur auf die Message an, warum dann nicht auch auf das TJSONArray
mit den Nummern?
- Das UrlEncode
kannst du dir komplett sparen, denn das macht TIdHttp.Post
von selber, somit würde also doppelt UrlEncoded
- Eine TStringList
hat schon eine passende Key-Value-Logik eingebaut, einfach nur benutzen
- So wie du die Exceptions behandelst ist ja grausam ... Exceptions werden entweder gefangen um da noch etwas zu retten (Wiederholung, Anpassung, etc.) oder umgewandelt (z.B. von EIdException
zu ESmsGatewayException
) aber auf keinen Fall so unterdrückt. Wenn du da jetzt einen Zugriffsfehler hast, dann wirst du das niemals mitbekommen. Sieht alles schön bunt aus "Ist bestimmt das SMS-Gateway dran schuld"
Delphi-Quellcode:
type
ESmsGatewayException =
class(
Exception);
ESmsGatewayApiException =
class( ESmsGatewayException );
procedure TForm2.PostExample;
var param : TStringList;
url :
string;
text :
string;
jsa : TJsonArray;
begin
param :=
nil;
jsa :=
nil;
try
param := TStringList.create;
param.Values['
access_token'] := '
43efcb76....................e3fdb6';
param.Values['
message'] := Edit1.Text;
param.Values['
send_to'] := '
post_contacts';
jsa := TJsonArray.Create();
jsa.AddElement(Edit2.Text);
param.Values['
post_contacts'] := jsa.ToString;
url := '
http://www.FreeSMSGateway.com/api_send';
try
text := http.Post(
url, param );
except
// Transport-Layer Fehler
on E : EIdException
do
raise ESmsGatewayException.Create(E.
Message);
end;
// Api-Fehler
if text <> '
Message sent'
then
raise ESmsGatewayApiException.Create( text );
// Wer es mag
ShowMessage( '
Nachricht wurde gesendet' );
finally
param.Free;
jsa.Free;
end;
end;
Generell solltest du dir überlegen ob es nicht mehr Sinn macht für den SMS-Versand ein Interface zu benutzen
Delphi-Quellcode:
ISmsGateway = interface
procedure SendMessage( const APhoneNumber, AMessage : string );
end;
und dann je nach Anwendungsfall einfach das zutreffende Gateway erzeugst. Innerhalb der Anwendung bleibt der Zugriff dann gleich:
Delphi-Quellcode:
var
SmsGateway : ISmsGateway;
SmsGateway.SendMessage( '12345678', 'Test-Nachricht' );
egal, welches konkrete Gateway da nun im Hintergrund bedient wird. Das macht die Sache wesentlich einfacher in der Benutzung (innerhalb der Anwendung) und der Erweiterung (neue Gateways implementieren)
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ea 0a 4c 14 0d b6 3a a4 c1 c5 b9
dc 90 9d f0 e9 de 13 da 60)