À propos de la méthode Rest de téléchargement de fichiers à l'aide de multipart / form-data dans H5 ou Delphi

table des matières

À propos de la méthode Rest de téléchargement de fichiers à l'aide de multipart / form-data dans H5 ou Delphi

1. Examinez d'abord le cas officiel: projet de test d'API cloud CloudAPI d'Amazon Amazon et Microsoft Azure

1. Unités principalement impliquées:

1.1. CloudRefactorUI.pas // $ {YourDelphiInstallPath} \ Samples \ Object Pascal \ Database \ CloudAPI \ CloudAPITest \ //: fichier d'unité d'interface principale de l'interface utilisateur de test de l'API Cloud   

1.1.2, CloudPopulator.pas // $ {YourDelphiInstallPath} \ Samples \ Object Pascal \ Database \ CloudAPI \ CloudAPITest \ //: fichier d'unité de test de l'API Cloud

1.1.3, Data.Cloud.AmazonAPI.pas // $ {YourDelphiInstallPath} \ source \ data \ cloud //: L'API Amazon de Delphi Cloud Data Cloud Computing est traduite en une unité de pascal

1.1.4, Data.Cloud.CloudAPI.pas // $ {YourDelphiInstallPath} \ source \ data \ cloud //: unité publique delphi cloud data cloud computing

2. Étapes pour postuler au service cloud:

2.1. Commencez par demander un compte sur la plate-forme du fournisseur de services cloud

2.2. Demander une description des services fournis par la plateforme cloud et ses paramètres d'accès

2.3. Demande de signature de service Signature

2.4. Lire les instructions d'accès à l'API de service et d'appel de code

3. Étapes de préparation de l'architecture et du code:

3.1, architecture et design

    3.1.1. Obtenir l'ID utilisateur du compte

Ci-dessus, il y a des codes officiels, voyez par vous-même! Ci-dessous, j'utilise l'API Alibaba Cloud Communication SMS Service pour expliquer ce qui suit (la partie du code est tirée du «produit de serveur Rest à trois niveaux de Gao Yong»):

3.2. Les étapes de base du code (vous devez suivre les instructions détaillées du service d'API cloud fourni par le service cloud pour implémenter l'interface étape par étape)

    3.2.1. Préparer toutes les API pour accéder aux ressources communes (variables)

    3.2.2. Vérification de la signature: obtenir la chaîne de signature finale requise Signature conformément aux exigences de l'API

    3.2.3 URL du service d'assemblage

    3.2.4, demander l'URL du service (Get ou Post), obtenir la réponse, analyser le résultat renvoyé des données Json ou XML

2. À propos du principe de multipart / form-data

1. Qu'est-ce que multipart / form-data

2. Pourquoi les données multipart / form-data apparaissent-elles?

3. Résolvez la logique de code de l'application Rest lorsque delphi utilise le système TNetHttp:

4. Reportez-vous au billet de blog des internautes: "Analyse approfondie de multipart / form-data" https://blog.csdn.net/wyn126/article/details/96451357

En relation avec ce blog:

Si vous l'aimez, cliquez simplement sur J'aime et Favoris ci-dessous, afin de pouvoir regarder le prochain partage:


 

À propos de la méthode Rest de téléchargement de fichiers à l'aide de multipart / form-data dans H5 ou Delphi

 

1. Examinez d'abord le cas officiel: projet de test d'API cloud CloudAPI d'Amazon Amazon et Microsoft Azure

$ {YourDelphiInstallPath} \ Samples \ Object Pascal \ Database \ CloudAPI \ CloudAPITest \ CloudAPITest.dproj

1. Unités principalement impliquées:

1.1. CloudRefactorUI.pas // $ {YourDelphiInstallPath} \ Samples \ Object Pascal \ Database \ CloudAPI \ CloudAPITest \ //: fichier d'unité d'interface principale de l'interface utilisateur de test de l'API Cloud   

1.1.2, CloudPopulator.pas // $ {YourDelphiInstallPath} \ Samples \ Object Pascal \ Database \ CloudAPI \ CloudAPITest \ //: fichier d'unité de test de l'API Cloud

1.1.3, Data.Cloud.AmazonAPI.pas // $ {YourDelphiInstallPath} \ source \ data \ cloud //: L'API Amazon de Delphi Cloud Data Cloud Computing est traduite en une unité de pascal

1.1.4, Data.Cloud.CloudAPI.pas // $ {YourDelphiInstallPath} \ source \ data \ cloud //: unité publique delphi cloud data cloud computing

 

2. Étapes pour postuler au service cloud:

2.1. Commencez par demander un compte sur la plate-forme du fournisseur de services cloud

 2.1.1, obtenez l'ID utilisateur du compte

 2.1.2. Obtenez l'AK du compte (la paire clé-valeur Json ou XML du compte): Clé de compte

 2.1.2. Obtenir le SK du compte (mot de passe Json ou paire clé-valeur XML): Clé secrète 

 

2.2. Demander une description des services fournis par la plateforme cloud et ses paramètres d'accès

 2.2.1, les étrangers semblent être appelés «seaux» (la traduction de tmd s'appelle «seaux»)

 

2.3. Demande de signature de service Signature

 2.3.1. Obtenir la signature du service requis

 

2.4. Lire les instructions d'accès à l'API de service et d'appel de code

 2.4.1, accès API et instructions d'appel de code

 

3. Étapes de préparation de l'architecture et du code:

3.1, architecture et design

    3.1.1. Obtenir l'ID utilisateur du compte

Ci-dessus, il y a des codes officiels, voyez par vous-même! Ci-dessous, j'utilise l'API Alibaba Cloud Communication SMS Service pour expliquer ce qui suit (la partie du code est tirée du «produit de serveur Rest à trois niveaux de Gao Yong»):

3.2. Les étapes de base du code (vous devez suivre les instructions détaillées du service d'API cloud fourni par le service cloud pour implémenter l'interface étape par étape)

    3.2.1. Préparer toutes les API pour accéder aux ressources communes (variables)

            3.2.1.1, baseURL : protocole SCHEME (http ou https la plupart des services cloud nécessitent https) + mots réservés spéciaux Schéma typique ': //' + hôte (nom de domaine hôte ou IP) 

                   Par exemple, Alibaba Cloud Communication baseURL: https://dysmsapi.aliyuncs.com

            3.2.1.2, SortedParams: TArray <string>;: Le tableau de paires clé-valeur du dictionnaire de paramètres du service cloud

                   Par exemple, le tableau de paires clé-valeur du dictionnaire de paramètres du service SMS Cloud d'Alibaba (une partie des paramètres en italique est répertoriée ci-dessous, et la plupart des paramètres de l'API du service cloud sont à peu près les mêmes pour le reste des paramètres ):

                    Paramètres : = TDictionary <chaîne, chaîne> .Create;

SignatureVersion ',' 1.0 '); // :




Signature version
                    Params.Add ('Action', 'SendSms'); //: Fonction spécifique au service
                    Params.Add ('Version', '2017-05-25'); //: Service version
                    Params.Add ( 'RegionId', 'cn-hangzhou'); //: La zone de service
                    Params.Add ('PhoneNumbers', PhoneNumbers); //: Autres paramètres nécessaires spécifiques au service
                    Params.Add ('SignName', SignName); //: La signature du service appliqué
                    Params.Add ('TemplateCode', TemplateCode); //: Autres paramètres nécessaires uniques au service
                    Params.Add ('TemplateParam', TemplateParam); //: Autres paramètres nécessaires propres au service Paramètre de préparation
                    Params.Add ('OutId', '' );//: paramètres de sortie ou données JSON

                    SortedParams : = Params.keys.ToArray;

                    TArray. Trier <string> (SortedParams);

            3.2.1.3. Construire la chaîne de requête de requête à signer

                    StringBuilder: = TStringBuilder.Create;

                    //..Le code est légèrement

                    SortedQueryString: = StringBuilder.ToString.Substring (1);

            3.2.1.4. URL codant la chaîne de demande à signer, suppression ou remplacement de caractères spéciaux de codage URL

                    TNetEncoding.Url.Encode

    3.2.2. Vérification de la signature: obtenir la chaîne de signature finale requise Signature conformément aux exigences de l'API

        Signer, le serveur cloud vous fournit l'application et votre code client doit être connu, mais le serveur et le client sont tenus de vérifier pour s'assurer que le demandeur (institution candidate) accède au service cloud sous son compte

        Signature

    3.2.3 URL du service d'assemblage

        Url : = 'https://dysmsapi.aliyuncs.com/?Signature=' + Signature + '&' + SortedQueryString ;

    3.2.4, demander l'URL du service (Get ou Post), obtenir la réponse, analyser le résultat renvoyé des données Json ou XML

      HTTP.ContentType : = ' application / x-www-form-urlencoded '; //: HTTP: = TNetHTTPClient.Create (nil);                                                                                             

        //: Ce HTTP.ContentType est l'affectation de paramètre importante des informations d'en-tête html importantes dont cet article doit parler                                                                                                               


      Réponse : = HTTP. Get ( Url ) .ContentAsString (TEncoding.UTF8);
      JsonObj : = TJSONObject.ParseJSONValue (Réponse) comme TJSONObject;

 

2. À propos du principe de multipart / form-data

1. Qu'est-ce que multipart / form-data

        C'est l'un des Enctype sous forme HTML, il en existe trois types:

        application / x-www-form-urlencoded   ========== "correspondant au paramètre de THTTPClient.Post dans delphi ASource: type Mime de TMultipartFormData: TMultipartFormData.Create ou TMultipartFormData.AddField ou TMultipartFormData.AddBytes ou TMultipartFormData.AddStream application binaire

                Si vous voulez envoyer une grande quantité de données binaires (non-ASCII), application / x-www-form-urlencoded est évidemment inefficace, car il a besoin de 3 caractères pour représenter un caractère non-ASCII. Par conséquent, dans ce cas, le format "multipart / form-data" doit être utilisé.

        multipart / form-data   ========== "Correspondant au paramètre de THTTPClient.Post dans delphi ASource: type Mime de TMultipartFormData: binaire de TMultipartFormData.AddFile  

                L'utilisation de "application / x-www-form-urlencoded" est inefficace pour l'envoi de grandes quantités de données binaires ou de texte contenant des caractères non ASCII. "Multipart / form-data" doit être utilisé pour soumettre des formulaires contenant des fichiers, des données non ASCII et des données binaires.

        text-plain (c'est -à- dire: l'application par défaut / x-www-urlencoded) ========== "correspondant à la chaîne de caractères attachée au lien URL de Get in delphi ou au contenu de la partie Corps de la page Web de l'article; ou head Méthode pour envoyer la demande d'en-tête.

                Par défaut, il s'agit de l'application / x-www-urlencoded. Lorsque le formulaire utilise une requête POST, les données seront encodées dans le corps au format x-www-urlencoded pour la transmission, et si une requête GET est envoyée, elle sera envoyée après le lien URL . Les requêtes GET ne prennent en charge que le jeu de caractères ASCII, donc si nous voulons envoyer du contenu avec un jeu de caractères plus grand, nous devons utiliser les requêtes POST.

2. Pourquoi les données multipart / form-data apparaissent-elles?

        Données du formulaire de soumission HTML:
        par défaut, il s'agit de l'application / x-www-urlencoded. Lorsque le formulaire utilise une requête POST, les données seront encodées dans le corps de x-www-urlencoded pour la transmission et si la requête GET est jointe, elle est jointe Envoyez après le lien URL. Les requêtes GET ne supportent que le jeu de caractères ASCII, donc si nous voulons envoyer du contenu avec un jeu de caractères plus grand, nous devons utiliser les requêtes POST.
        Si vous voulez envoyer une grande quantité de données binaires (non-ASCII), application / x-www-form-urlencoded est évidemment inefficace, car il a besoin de 3 caractères pour représenter un caractère non-ASCII. Par conséquent, dans ce cas, le format "multipart / form-data" doit être utilisé.
        L'utilisation de "application / x-www-form-urlencoded" est inefficace pour envoyer de grandes quantités de données binaires ou de texte contenant des caractères non ASCII. "Multipart / form-data" doit être utilisé pour soumettre des formulaires contenant des fichiers, des données non ASCII et des données binaires.

3. Résolvez la logique de code de l'application Rest lorsque delphi utilise le système TNetHttp:

        Solution de repos de Delphi : " Delphi Restful: quatre façons d'implémentation client et leur comparaison ": https://blog.csdn.net/pulledup/article/details/104132753

        System.Net.HttpClientComponent.pas   ==========》 HTTP: = TNetHTTPClient.Create (nil); ==========》     

                   À propos de la soumission de plusieurs objets de données TMultipartFormData du formulaire:

                   1. Objets de données multiples de la
                   fonction Post form Post (const AURL: string; const ASource: TMultipartFormData ; const AResponseContent: TStream = nil;  const AHeaders: TNetHeaders = nil): IHTTPResponse ; overload;
                           

                   2, Mettez plusieurs objets de données de la
                   fonction de formulaire Put (const AURL: string; const ASource: TMultipartFormData ; const AResponseContent: TStream = nil;  const AHeaders: TNetHeaders = nil): IHTTPResponse ; overload; ========== =》 IHTTPResponse: System.Net.HttpClient.pas
                           

        System.Net.HttpClient.pas   ==========》 FHttpClient: = THTTPClient.Create; FHttpClient.OnReceiveData: = DoOnReceiveData; Résultat: = THTTPClient (TURLSchemes.GetURLClientInstance ('HTTP')); ==========》 

        System.Net.URLClient.pas   ==========》 FSchemeClients.TryGetValue (AScheme.ToUpper, LClientClass); si LClientClass <> nil alors Result: = LClientClass.CreateInstance; TURLClient.CreateInstance: TURLClient; TURLClient.SetCustomHeaderValue (nom const, valeur: chaîne);

        System.Net.Mime.pas  ==========》

       

                   TMultipartFormData = class (TObject) //: Voir les propriétés publiques publiques et les méthodes de la classe pour plus de détails

                    TMimeTypes = class (TObject) //: Voir les propriétés publiques publiques et les méthodes de la classe pour plus de détails =========== "HTTP.ContentType: = 'MimeType type value';

                    TAcceptValueListBase <T: TAcceptValueItem, constructor> = class (TObject) //: Voir les propriétés publiques publiques et les méthodes de la classe pour plus de détails

                    THeaderValueList = class (TObject) //: Voir les propriétés publiques publiques et les méthodes de la classe pour plus de détails

       

        System.NetConsts.pas   ========== "(constante, message d'erreur)

//:  uses System.NetConsts;
const
  DefaultUserAgent = 'Embarcadero URI Client/1.0'; // Do not translate

  // Common Header Names
  sUserAgent = 'User-Agent'; // Do not translate
  sAccept = 'Accept'; // Do not translate
  sAcceptCharset = 'Accept-Charset'; // Do not translate
  sAcceptEncoding = 'Accept-Encoding'; // Do not translate
  sAcceptLanguage = 'Accept-Language'; // Do not translate
  sAcceptRanges = 'Accept-Ranges'; // Do not translate
  sContentEncoding = 'Content-Encoding'; // Do not translate
  sContentLanguage = 'Content-Language'; // Do not translate
  sContentLength = 'Content-Length'; // Do not translate
  sContentType = 'Content-Type'; // Do not translate
  sLastModified = 'Last-Modified'; // Do not translate
  sContentDisposition = 'Content-Disposition'; // Do not translate

  sLocation = 'Location'; // Do not translate
  sSetCookie = 'Set-Cookie'; // Do not translate
  sCookie = 'Cookie'; // Do not translate

  sRange = 'Range'; // Do not translate

  sXMethodOverride = 'x-method-override'; // Do not translate

  sWWWAuthenticate  = 'WWW-Authenticate'; // Do not translate
  sProxyAuthenticate  = 'Proxy-Authenticate'; // Do not translate
  sAuthorization = 'Authorization'; // Do not translate
  sProxyAuthorization = 'Proxy-Authorization'; // Do not translat

4. Reportez-vous au billet de blog des internautes: " Analyse approfondie de multipart / form-data "   https://blog.csdn.net/wyn126/article/details/96451357

 

En relation avec ce blog:

        1. " Delphi Restful: Quatre façons d'implémentation client et leur comparaison "

        2. " RAD Studio 10.4.1 TEdgeBrowser et interaction javascript - Utilisation du contrôle du navigateur Edge basé sur Chromium 2 "

        3. "Delphi Restful Interaction entre Client JavaScript et Middleware Server"

Si vous l'aimez, cliquez simplement sur J'aime et Favoris ci-dessous, afin de pouvoir regarder le prochain partage:

 

Je suppose que tu aimes

Origine blog.csdn.net/pulledup/article/details/109902772
conseillé
Classement