Recupero e invio di dati in un servizio REST esterno

Completato

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.