H5またはdelphiでmultipart / form-dataを使用してファイルをアップロードするRestメソッドについて

目次

H5またはdelphiでmultipart / form-dataを使用してファイルをアップロードするRestメソッドについて

1.最初に公式ケースを見てください:AmazonAmazonとMicrosoftAzureのCloudAPIクラウドAPIテストプロジェクト

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.2。クラウドプラットフォームが提供するサービスとそのアクセスパラメータの説明を申請する

2.3。サービス署名署名を申請する

2.4。サービス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.2。署名の検証:API要件に従って、最終的に必要な署名文字列署名を取得します

    3.2.3組立サービスのUrl

    3.2.4、サービスUrl(GetまたはPost)の要求、応答応答の取得、JsonまたはXMLデータの返された結果の解析

2.マルチパート/フォームデータの原理について

1. multipart / form-dataとは何ですか

2. multipart / form-dataが表示されるのはなぜですか?

3. delphiがTNetHttpシステムを使用する場合、Restアプリケーションのコードロジックを解決します。

4.netizensのブログ投稿「multipart / form-dataの詳細な分析」https://blog.csdn.net/wyn126/article/details/96451357を参照してください。

このブログに関連する:

気に入った場合は、下の[いいね]と[お気に入り]をクリックするだけで、次の共有を見ることができます。


 

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。GetUrl).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インタラクション」

気に入った場合は、下の[いいね]と[お気に入り]をクリックするだけで、次の共有を見ることができます。

 

おすすめ

転載: blog.csdn.net/pulledup/article/details/109902772