目次
H5またはdelphiでmultipart / form-dataを使用してファイルをアップロードするRestメソッドについて
1.最初に公式ケースを見てください:AmazonAmazonとMicrosoftAzureのCloudAPIクラウドAPIテストプロジェクト
2.1。まず、クラウドサービスプロバイダーのプラットフォームでアカウントを申請します
2.2。クラウドプラットフォームが提供するサービスとそのアクセスパラメータの説明を申請する
3.2。コードの基本的な手順(インターフェイスを段階的に実装するには、クラウドサービスによって提供されるクラウドAPIサービスの詳細な手順に従う必要があります)
3.2.1。共通のリソース(変数)にアクセスするためにすべてのAPIを準備します
3.2.2。署名の検証:API要件に従って、最終的に必要な署名文字列署名を取得します
3.2.4、サービスUrl(GetまたはPost)の要求、応答応答の取得、JsonまたはXMLデータの返された結果の解析
1. multipart / form-dataとは何ですか
2. multipart / form-dataが表示されるのはなぜですか?
3. delphiがTNetHttpシステムを使用する場合、Restアプリケーションのコードロジックを解決します。
気に入った場合は、下の[いいね]と[お気に入り]をクリックするだけで、次の共有を見ることができます。
H5またはdelphiでmultipart / form-dataを使用してファイルをアップロードするRestメソッドについて
1.最初に公式ケースを見てください:AmazonAmazonとMicrosoftAzureのCloudAPIクラウドAPIテストプロジェクト
$ {YourDelphiInstallPath} \ Samples \ Object Pascal \ Database \ CloudAPI \ CloudAPITest \ CloudAPITest.dproj
1.主に関与するユニット:
1.1。CloudRefactorUI.pas // $ {YourDelphiInstallPath} \ Samples \ Object Pascal \ Database \ CloudAPI \ CloudAPITest \ //:CloudAPIテストUIメインインターフェイスユニットファイル
1.1.2、CloudPopulator.pas // $ {YourDelphiInstallPath} \ Samples \ Object Pascal \ Database \ CloudAPI \ CloudAPITest \ //:CloudAPIテストユニットファイル
1.1.3、Data.Cloud.AmazonAPI.pas // $ {YourDelphiInstallPath} \ source \ data \ cloud //:Delphi Cloud Data CloudComputingのAmazonAPIはパスカルの単位に変換されます
1.1.4、Data.Cloud.CloudAPI.pas // $ {YourDelphiInstallPath} \ source \ data \ cloud //:デルファイクラウドデータクラウドコンピューティングパブリックユニット
2.クラウドサービスに申し込む手順:
2.1。まず、クラウドサービスプロバイダーのプラットフォームでアカウントを申請します
2.1.1、アカウントのユーザーIDを取得します
2.1.2。アカウントのAK(アカウントのJsonまたはXMLキーと値のペア)を取得します。アカウントキー
2.1.2。アカウントのSKを取得します(パスワードJsonまたはXMLキーと値のペア):秘密鍵
2.2。クラウドプラットフォームが提供するサービスとそのアクセスパラメータの説明を申請する
2.2.1、外国人は「バケット」と呼ばれているようです(tmdの翻訳は「バケット」と呼ばれています)
2.3。サービス署名署名を申請する
2.3.1。必要なサービスの署名を取得します
2.4。サービスAPIアクセスとコード呼び出し手順を読む
2.4.1、APIアクセスおよびコード呼び出し命令
3.アーキテクチャとコードを準備する手順:
3.1、アーキテクチャと設計
3.1.1。アカウントのユーザーIDを取得します
上に、公式のコードがあります、あなた自身で見てください!以下では、Alibaba Cloud Communication SMS Service APIを使用して、次のように説明します(コード部分は、「Gao Yongの3層レストサーバー製品」から取得したものです)。
3.2。コードの基本的な手順(インターフェイスを段階的に実装するには、クラウドサービスによって提供されるクラウドAPIサービスの詳細な手順に従う必要があります)
3.2.1。共通のリソース(変数)にアクセスするためにすべてのAPIを準備します
3.2.1.1、baseURL:プロトコルスキーム(httpまたはhttpsほとんどのクラウドサービスにはhttpsが必要)+特別な予約済みワード一般的なスキーム「://」+ホスト(ホストドメイン名またはIP)
たとえば、Alibaba Cloud Communication baseURL:https://dysmsapi.aliyuncs.com
3.2.1.2、SortedParams:TArray <string> ;:クラウドサービスのパラメータディクショナリキーと値のペア配列
たとえば、Alibaba Cloud SMSサービスのパラメータディクショナリキーと値のペア配列(イタリック体のパラメータの一部を以下に示します。ほとんどのクラウドサービスAPIパラメータは、残りのパラメータでほぼ同じです)。
パラメータ:= TDictionary <文字列、文字列> .Create;
SignatureVersion '、' 1.0 '); //:
署名バージョン
Params.Add( 'Action'、 'SendSms'); //:サービス固有の関数
Params.Add( 'Version'、 '2017-05-25'); //:サービスバージョン
Params.Add( 'RegionId'、 'cn-hangzhou'); //:サービスエリア
Params.Add( 'PhoneNumbers'、PhoneNumbers); //:サービス
Params.Add( 'SignName'、SignName);に固有のその他の必要なパラメーター//:適用されたサービスの署名
Params.Add( 'TemplateCode'、TemplateCode); //:サービスに固有のその他の必要なパラメーター
Params.Add( 'TemplateParam'、TemplateParam); //:サービスに固有のその他の必要なパラメーター準備パラメータ
Params.Add( 'OutId'、 '' );//:出力パラメータまたはJSONデータ
SortedParams:= Params.keys.ToArray;
TArray。ソート<文字列>(SortedParams);
3.2.1.3。署名するリクエストクエリ文字列を作成します
StringBuilder:= TStringBuilder.Create;
// ...コードは少しです
SortedQueryString:= StringBuilder.ToString.Substring(1);
3.2.1.4。署名するリクエスト文字列をエンコードするURL、特別なURLエンコード文字の削除または置換
TNetEncoding.Url.Encode
3.2.2。署名の検証:API要件に従って、最終的に必要な署名文字列署名を取得します
署名すると、クラウドサーバーがアプリケーションを提供し、クライアントコードがわかっている必要がありますが、サーバーとクライアントの両方が、申請者(申請機関)が自分のアカウントでクラウドサービスにアクセスしていることを確認する必要があります。
署名
3.2.3組立サービスのUrl
Url:= 'https://dysmsapi.aliyuncs.com/?Signature =' +署名+ '&' + SortedQueryString ;
3.2.4、サービスUrl(GetまたはPost)の要求、応答応答の取得、JsonまたはXMLデータの返された結果の解析
HTTP.ContentType:= ' application / x-www-form-urlencoded '; //:HTTP:= TNetHTTPClient.Create(nil);
//:このHTTP.ContentTypeは、この記事で説明する必要のある重要なhtmlヘッダー情報の重要な設定割り当てです。
応答:= HTTP。Get(Url).ContentAsString(TEncoding.UTF8);
JsonObj:= TJSONObject.ParseJSONValue(Response)as TJSONObject;
2.マルチパート/フォームデータの原理について
1. multipart / form-dataとは何ですか
これはHTML形式のEnctypeの1つであり、次の3つのタイプがあります。
application / x-www-form-urlencoded ========== "delphi ASourceのTHTTPClient.Postのパラメーターに対応:TMultipartFormDataのMimeタイプ:TMultipartFormData.CreateまたはTMultipartFormData.AddFieldまたはTMultipartFormData.AddBytesまたはTMultipartFormData.AddStreamアプリケーションバイナリ
大量のバイナリデータ(非ASCII)を送信する場合、非ASCII文字を表すために3文字が必要なため、application / x-www-form-urlencodedは明らかに非効率的です。したがって、この場合は「multipart / form-data」形式を使用する必要があります。
multipart / form-data ========== "delphi ASourceのTHTTPClient.Postのパラメーターに対応:TMultipartFormDataのMimeタイプ:TMultipartFormData.AddFileのバイナリ
「application / x-www-form-urlencoded」を使用すると、非ASCII文字を含む大量のバイナリデータまたはテキストを送信するには非効率的です。「Multipart / form-data」は、ファイル、非ASCIIデータ、およびバイナリデータを含むフォームを送信するために使用する必要があります。
text-plain(ie:デフォルトのapplication / x-www-urlencoded)========== "Get indelphiのurlリンクに添付された文字列または投稿Webページの本文部分のコンテンツに対応する;またはheadヘッダーリクエストを送信するメソッド。
デフォルトでは、application / x-www-urlencodedです。フォームでPOSTリクエストを使用する場合、データは送信用にx-www-urlencoded形式で本文にエンコードされ、GETリクエストが送信されると、urlリンクの後に送信されます。 。GETリクエストはASCII文字セットのみをサポートするため、より大きな文字セットでコンテンツを送信する場合は、POSTリクエストを使用する必要があります。
2. multipart / form-dataが表示されるのはなぜですか?
HTML送信フォームデータ:
デフォルトでは、application / x-www-urlencodedです。フォームがPOSTリクエストを使用する場合、データは送信用にx-www-urlencodedで本文にエンコードされ、GETリクエストが添付されている場合は添付されます。 urlリンクの後に送信します。GETリクエストはASCII文字セットのみをサポートするため、より大きな文字セットでコンテンツを送信する場合は、POSTリクエストを使用する必要があります。
大量のバイナリデータ(非ASCII)を送信する場合、非ASCII文字を表すために3文字が必要なため、application / x-www-form-urlencodedは明らかに非効率的です。したがって、この場合は「multipart / form-data」形式を使用する必要があります。
「application / x-www-form-urlencoded」を使用すると、非ASCII文字を含む大量のバイナリデータまたはテキストを送信するには非効率的です。「Multipart / form-data」は、ファイル、非ASCIIデータ、およびバイナリデータを含むフォームを送信するために使用する必要があります。
3. delphiがTNetHttpシステムを使用する場合、Restアプリケーションのコードロジックを解決します。
DelphiのRestソリューション:「DelphiRestful:クライアント実装の4つの方法とその比較」:https://blog.csdn.net/pulledup/article/details/104132753
System.Net.HttpClientComponent.pas ==========》 HTTP:= TNetHTTPClient.Create(nil); ==========》
フォームの複数のデータオブジェクトTMultipartFormDataの送信について:
1. Postフォーム
関数Post(const AURL:string; const ASource: TMultipartFormData ; const AResponseContent:TStream = nil; const AHeaders: TNetHeaders = nil)の複数のデータオブジェクト: IHTTPResponse ;オーバーロード;
2、フォーム
関数の複数のデータオブジェクトを配置しますPut(const AURL:string; const ASource: TMultipartFormData ; const AResponseContent:TStream = nil; const AHeaders: TNetHeaders = nil): IHTTPResponse ;オーバーロード; ========= =》 IHTTPResponse:System.Net.HttpClient.pas
System.Net.HttpClient.pas ==========》 FHttpClient:= THTTPClient.Create; FHttpClient.OnReceiveData:= DoOnReceiveData; 結果:= THTTPClient(TURLSchemes.GetURLClientInstance( 'HTTP')); ==========》
System.Net.URLClient.pas ==========》 FSchemeClients.TryGetValue(AScheme.ToUpper、LClientClass); LClientClass <> nilの場合、結果:= LClientClass.CreateInstance; TURLClient.CreateInstance:TURLClient; TURLClient.SetCustomHeaderValue(const Name、Value:string);
System.Net.Mime.pas ==========》
((
TMultipartFormData = class(TObject)//:詳細については、クラスのパブリックパブリックプロパティとメソッドを参照してください
TMimeTypes = class(TObject)//:詳細については、クラスのパブリックパブリックプロパティとメソッドを参照してください=========== "HTTP.ContentType:= 'MimeType type value';
TAcceptValueListBase <T:TAcceptValueItem、コンストラクター> =クラス(TObject)//:詳細については、クラスのパブリックパブリックプロパティとメソッドを参照してください
THeaderValueList = class(TObject)//:詳細については、クラスのパブリックパブリックプロパティとメソッドを参照してください
)。
System.NetConsts.pas ========== "(一定、エラーメッセージ)
//: 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.netizensのブログ投稿「multipart / form-dataの詳細な分析」 https://blog.csdn.net/wyn126/article/details/96451357を参照してください。
このブログに関連する:
1.「DelphiRestful:クライアント実装の4つの方法とそれらの比較」
2. 「RADStudio10.4.1TEdgeBrowserとjavascriptの相互作用-クロムベースのEdgeブラウザコントロールの使用法2 」
3. 「クライアントJavaScriptとミドルウェアサーバー間のDelphiRestfulインタラクション」
気に入った場合は、下の[いいね]と[お気に入り]をクリックするだけで、次の共有を見ることができます。