Jump to content
Ian Branch

Some REST help please.

Recommended Posts

Hi Team,

My Customer has asked me if I can add SMS sending to his Apps.

In support he has sent me a document from Vodafone, he is a repairer for Vodafone, with the following information.

image.thumb.png.8ee27feac03c35246c1e827e8198dcdf.png

I know absolutely nothing about REST and/or its usage in/with Delphi.

Could I prevail on someone to create a small delphi unit that incorporates whatever is necessary to send an sms?

It would be very much appreciated.

Regards & TIA,

Ian

 

 

Share this post


Link to post

Hi

 

Delphi has TNetHTTPClient/TNetHTTPRequest components and THTTPClient/THTPRequest classes to work with http(s) requests. You can use them to POST something if you want.

 

Look at btnSendFileClick method in https://github.com/DeveloppeurPascal/Des-solutions-de-synchronisations-de-donnees/blob/master/04-Internet/Client/Unit1.pas or how I use POST request in the DeepL4Delphi library at https://github.com/DeveloppeurPascal/DeepL4Delphi

 

And if you want to use TRESTClient/TRESTRequest, you can use the REST Debugger available in "tools" menu of the IDE to do a sample request and export the components from it.

Share this post


Link to post

It is a very simple POST method request to a HTTPS address and with a JSON body.

A small example how this can be done with Indy (included in Delphi) is here:

 

https://mikejustin.wordpress.com/2015/03/14/indy-10-6-https-post/

 

Line 16 defines the body of the message. Replace it with your required JSON string.

Line 21 send the message, change the server address to your destination server.

 

It requires the OpenSSL DLLs which can be downloaded from https://github.com/IndySockets/OpenSSL-Binaries

Edited by mjustin

Share this post


Link to post
On 8/7/2023 at 5:01 PM, Mohammed Nasman said:

Hi Ian, 


  It seems an easy one, PM me and I will help you.

Regards,

Yeah, I'm sorry, but that is not how this forum works. If every question would be resolved via PM, anyone looking for an answer to the same questions would get to find nothing here... and have no motivation to share his knowledge in this forum.

  • Like 2

Share this post


Link to post
1 hour ago, Sherlock said:

Yeah, I'm sorry, but that is not how this forum works. If every question would be resolved via PM, anyone looking for an answer to the same questions would get to find nothing here... and have no motivation to share his knowledge in this forum.

You are right, sorry for that.


But because he said he doesn't know anything about rest api, so I was going to help to guide him to start doing that. and that will not answer the question directly

Edited by Mohammed Nasman
  • Like 1

Share this post


Link to post
On 8/10/2023 at 3:44 AM, Mohammed Nasman said:

You are right, sorry for that.


But because he said he doesn't know anything about rest api, so I was going to help to guide him to start doing that. and that will not answer the question directly

There are plenty of Delphi examples that could be cited as guides.

 

Google this: "how to query a rest api using delphi"

 

Even asking ChatGPT can elicit a decent response

Share this post


Link to post

Hi Team,

I'm back.  Thank you for your inputs.

I have this so far:

procedure TForm12.Button1Click(Sender: TObject);
begin
  //
//  The RESTClient has already been configured.
//
  RESTRequest1.AddParameter('username', 'email@email.com');      
  RESTRequest1.AddParameter('secret', 'password');
  RESTRequest1.AddParameter('shortcode', 'pacificbulksms');
  RESTRequest1.AddParameter('msisdn', '6799998122');               //  I take it this is the destination mobile Phone #??
  RESTRequest1.AddParameter('message', 'Hello World');

  // Call the REST API and handle the response
  RESTRequest1.Execute;

  // Access the response content
  if RESTResponse1.StatusCode = 200 then
  begin
    // Process the response content (e.g., RESTResponse.Content)
    var sResponse := RESTResponse1.Content;
    Label1.Caption := sResponse;
    //
    //  Example response  {"result":"success","code":"200","data":{"text":"SMS sent successfully."}}
    var sResult := GetResponseParameters(sResponse, 3, 4);
    var sCode := GetResponseParameters(sResponse, 7, 8);
    var sMessage := GetResponseParameters(sResponse, 13, 14);
  end
  else
  begin
    // Handle error cases
  end;
  //
end;

The RESTClient has the BaseURL set as "https://pacificbulksms.com".

The RESTRequest has the Resource set as "api/restJson".

Are there any other default settings I need to change, or settings I need to make?

Aside of course getting actual usable test parameters from Vodaphone. 😉 

 

Regards & TIA,

Ian

Share this post


Link to post

So, I got test parameters from Vodafone.

When I run the App I get a 'Empty Request...' message.

Clearly I have missed setting something. 😞

 

Ian

Edited by Ian Branch

Share this post


Link to post
10 hours ago, Ian Branch said:

So, I got test parameters from Vodafone.

When I run the App I get a 'Empty Request...' message.

Clearly I have missed setting something. 😞

 

Ian

The URL ?

 

Did you tried with REST Debugger to be sure you have all parameters ?

Share this post


Link to post

Hi Patrick,

When I put the Parameters into the REST Debugger, it says it is successful.

When I have the parameters in the RESTRequest and right-click|Run, it is successful.

But, If I leave The Client and Request exactly the same and inthe Delphi App do RESTRequest1.Execute, it fails. 😞

procedure TForm12.btnComponentsClick(Sender: TObject);
var
  obj, code, data: TJSONObject;
  sCode, url: string;
begin
  //
  // Call the REST API and handle the response
  RESTRequest1.Execute;
  //
  ShowMessage('Status Code = ' + RESTResponse1.StatusCode.ToString);
  obj := RESTResponse1.JSONValue as TJSONObject;
  scode := obj.Values['code'].Value;
  data := obj.Values['data'] as TJSONObject;
  url := data.Values['text'].Value;
  ShowMessage('Code = ' + scode + sLineBreak + 'Text = ' + url);

end;

Returning 'Status Code = 200' for the first ShowMessage, and 'Code = 302  Text = Empty Request.....' for the second showmessage.  😞

 

Regards,

Ian

Share this post


Link to post

May be I missed it, but I cannot see where you set RESTRequest1..Method to rmPost (the default is rmGet). The default parameter kind is pkGetOrPost, which put the parameters in the URL for GET and into the body for POST. This would explain the "Empty Request..." error.

Share this post


Link to post

Correction!  I thought it had been successful in the Debugger but I was looking in the wrong place. 😞

Still an Empty Request error.

This is the Debugger Request Tab:

image.thumb.png.dae47282b13fab2525dee1bc900c8d0c.png

 

This is the Parameters Tab, with key info changed: 😉

image.thumb.png.2adc61d03cdcce49a7d94fb8221ce4ed.png

You will note the 'Response' says 200:OK.....   But the Tabular Data Tab says it was an error.

I spoke to the Phone owner and he hasn't received any messages.

I'm confused.

 

Ian

 

 

 

Share this post


Link to post
15 minutes ago, Uwe Raabe said:

The default parameter kind is pkGetOrPost,

Hi Uwe,

What should this parameter be?

All the parameters basically look like this:

image.png.3626c724fc7985fc0719ca6b033c5ee3.png

 

Ian

Edited by Ian Branch

Share this post


Link to post
7 minutes ago, Ian Branch said:

Hi Uwe,

What should this parameter be?

 

Ian

It depends on how the API expect to receive them.

 

The GET/POST is use as GET param when you send a GET request and as POST params when you send a POST request.

 

The status code 200 is normal : it's the http/s return status code. It says the URL you called has answered.

 

As we see in the screen capture, Vodafone answered with a JSON object with 3 properties : result, code, and data as a JSON object.

 

Fix the problem in REST debugger and export the components. Open a text editor (or Delphi's code editor), paste the result and you'll have all properties of the components to change in the form editor or by code depending on what you want to do.

Edited by Patrick PREMARTIN

Share this post


Link to post

As I understand it, your doc integration displays a REQUEST with a JSON as the body of the request. It's not a POST/GET standard call... and they must not having called it "REST API". Try to pass the parameters as BODY fields instead of GET/POST.

 

Other way could be to copy/paste the object JSON generated with your parameters directly in the first tab in REST Debugger as "personalized body".

Share this post


Link to post

Hi Patrick,

7 minutes ago, Patrick PREMARTIN said:

Try to pass the parameters as BODY fields instead of GET/POST.

You mean put this:

"{"username": "email@mail.com", "secret":"password","shortcode":pacificbulksms","msisdn":"6798688008","message":"Hello James..."}"

into the Custom body?  With the correct values of course. 😉

I just tried that, same result.

 

Ian

Share this post


Link to post

IMHO the best way ist to use a dedicated class handling the parameters and place that in body:

type
  TMyParam = class
  private
    FUserName: string;
    FSecret: string;
    FShortcode: string;
    FMsisdn: string;
    FMessage: string;
  public
    property Message: string read FMessage write FMessage;
    property Msisdn: string read FMsisdn write FMsisdn;
    property Secret: string read FSecret write FSecret;
    property Shortcode: string read FShortcode write FShortcode;
    property UserName: string read FUserName write FUserName;
  end;
...
  var myParam := TMyParam.Create;
  try
    myParam.UserName := 'email@email.com';
    myParam.Secret :='password';
    myParam.Shortcode := 'pacific bulkms';
    myParam.Msisdn := '6799998122';
    myParam.Message := 'Hello World';
    RestRequest1.AddBody(myParam);
  finally
    myParam.Free;
  end;

 

  • Like 2

Share this post


Link to post

CRACKED IT!!!!

As Patrick suggested, put the Json request into the Custom body. 

It didn't work for me the first time as I suspect I had the Json constructed wrong, and I still had Parameters in the RESTRequest.

All sorted now.  Now to actually create the App.  🙂

My thanks to all that contributed to my first foray into REST.  Appreciated.

 

Regards,

Ian

  • Like 1

Share this post


Link to post

Glad it's up and running.


Don't hesitate to give a slap in my name to those people who make a REST API that isn't a REST API just because they use a POST. :classic_ninja:

  • Haha 1

Share this post


Link to post
4 hours ago, Patrick PREMARTIN said:

Glad it's up and running.


Don't hesitate to give a slap in my name to those people who make a REST API that isn't a REST API just because they use a POST. :classic_ninja:

Why could a POST not be a port of a REST API interface?

 

  • Like 1

Share this post


Link to post

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×