Einzelnen Beitrag anzeigen

Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Datenübergabe JSON-Array an FreeSMS-Anbieter

  Alt 2. Apr 2014, 18:06
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 sentthen
      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)

Geändert von Sir Rufo ( 2. Apr 2014 um 18:11 Uhr)
  Mit Zitat antworten Zitat