table des matières
1. Unités principalement impliquées:
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.1. Obtenir l'ID utilisateur du compte
3.2.1. Préparer toutes les API pour accéder aux ressources communes (variables)
3.2.3 URL du service d'assemblage
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:
À 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: