Recupero e invio di dati in un servizio REST esterno
L'esempio seguente combina tutte le varie classi e funzioni HTTP per recuperare i dati da un servizio esterno. Il servizio esterno restituisce un documento JSON con le informazioni sull'utente. È possibile testare i servizi REST nel sito Web jsonplaceholder.typicode.com. Il sito rappresenta un'area in cui esercitarsi gratuitamente e richiedere, aggiungere e modificare dati.
procedure GetUserInformation(UserNumber: Integer)
var
Client: HttpClient;
ResponseMessage: HttpResponseMessage;
ResponseString: Text;
begin
if not Client.Get(StrSubstNo('https://jsonplaceholder.typicode.com/users/%1',
UserNumber), ResponseMessage) then
Error(ErrorInfo.Create('The call to the web service failed.'));
if not ResponseMessage.IsSuccessStatusCode() then
Error(ErrorInfo.Create('The web service returned an error message:\\' +
'Status code: ' + Format(ResponseMessage.HttpStatusCode()) +
'Description: ' + ResponseMessage.ReasonPhrase()));
ResponseMessage.Content().ReadAs(ResponseString);
end;
La variabile ResponseString conterrà il documento JSON come stringa. È possibile usare le classi JSON predefinite per analizzare la stringa e lavorare con il contenuto. È anche possibile usare la classe HttpClient per caricare i dati in un servizio REST. L'esempio di codice successivo invia dati e un'immagine a un servizio esterno. Questo servizio può, ad esempio, eseguire l'elaborazione delle immagini. In questo esempio, viene recuperata la prima immagine di un determinato elemento. Il campo Immagine in Elementi è di tipo MediaSet e, pertanto, può contenere più immagini. Queste immagini vengono archiviate nella tabella Elementi multimediali tenant.
procedure ChangeToBlackAndWhitePicture(Item: Record Item)
var
TenantMedia: Record "Tenant Media";
Client: HttpClient;
Content: HttpContent;
ResponseMessage: HttpResponseMessage;
Stream: InStream;
Url: Text;
begin
if not (Item.Picture.Count() > 0) then
exit;
if not TenantMedia.Get(Item.Picture.Item(1)) then
exit;
TenantMedia.CalcFields(Content);
if not TenantMedia.Content.HasValue() then
exit;
TenantMedia.Content.CreateInStream(Stream);
Content.WriteFrom(Stream);
Url := 'https://mywebsite.com/ImageConverter';
if not client.Post(Url, Content, ResponseMessage) then
exit;
if not ResponseMessage.IsSuccessStatusCode() then
exit;
ResponseMessage.Content().ReadAs(Stream);
Clear(Item.Picture);
Item.Picture.ImportStream(Stream, 'New Image');
Item.Modify(true);
end;
È importante inserire sempre le chiamate Client.Get, Client.Post, Client.Put e altre chiamate all'interno di un'istruzione if. Ognuna di queste procedure restituisce un valore booleano che indica se è possibile impostare correttamente una connessione al server. Prima di poter inviare un HttpRequestMessage, è necessario che Business Central Server e il server dell'endpoint creino una connessione.
A volte le connessioni ai servizi esterni possono essere bloccate da Business Central stesso o da un firewall. Se la chiamata è bloccata da Business Central, è necessario aprire la pagina Gestione estensioni e selezionare l'estensione per aprire la pagina Impostazioni estensione. Accertarsi che l'opzione Consenti richieste HttpClient sia attivata.
Ciò non garantisce che la chiamata sia stata completata con successo e abbia portato a una risposta corretta. Pertanto, è necessario testare la procedura IsSuccessStatusCode sulla variabile HttpResponseMessage. Tuttavia, garantisce che sia possibile stabilire una connessione e inviare un messaggio HttpRequestMessage all'endpoint.