SpringMVC-HTTPリクエストプロジェクトの実践の概要

(1)MIMEの概要

(1はじめに

文法構造

type/subtype         类型/独立类型

メディアタイプ(多目的インターネットメール拡張機能またはMIMEタイプと呼ばれることが多い)は、ドキュメント、ファイル、またはバイトストリームの性質と形式を表現するために使用される標準です。これは、IETF RFC6838で定義および標準化されています。

重要:ブラウザは通常、URLの処理方法を決定するために(ファイル拡張子ではなく)MIMEタイプを使用するため、Webサーバーが応答ヘッダーに正しいMIMEタイプを追加することが非常に重要です。設定が正しくないと、ブラウザがファイルの内容を歪めたり、ウェブサイトが正常に動作しなかったり、ダウンロードしたファイルが正しく処理されなかったりする場合があります。

MIMEの構成構造は非常に単純で、タイプとサブタイプの間に「/」で区切られた2つの文字列で構成されています。スペースは使用できません。typeは、複数のサブカテゴリに分割できる独立したカテゴリを表します。サブタイプは、細分化後の各タイプを表します。

MIMEタイプでは大文字と小文字は区別されませんが、従来の記述方法は小文字です。

(2)独立型
text/plain
text/html
image/jpeg
image/png
audio/mpeg
audio/ogg
audio/*
video/mp4
application/*
application/json
application/javascript
application/ecmascript
application/octet-stream

ここに画像の説明を挿入

テキストファイルタイプに特定のサブタイプがない場合は、text / plainが使用されます。同様に、バイナリファイルには特定のサブタイプまたは既知のサブタイプがありません。つまり、application / octet-streamが使用されます。

(2)4つの一般的なPOSTデータ送信方法

プロトコルは、POSTによって送信されたデータをエンティティ本体に配置する必要があることを規定していますが、プロトコルは、データが使用する必要のあるエンコード方法を指定していません。実際、最後に送信されたHTTPリクエストが上記の形式を満たしている限り、開発者はメッセージ本文の形式を自分で完全に決定できます。

ただし、送信されるデータについては、サーバーがデータを正常に解析することだけが意味があります。php、pythonなどの一般的なサーバー言語とそのフレームワークには、一般的なデータ形式を自動的に解析するための組み込み関数があります。サーバーは通常、リクエストのメッセージ本文がリクエストヘッダーのContent-Typeフィールドに従ってどのようにエンコードされているかを認識しており、本文を解析します。したがって、POSTデータ送信スキームに関しては、Content-Typeとメッセージ本文のエンコード方式の2つの部分が含まれます。それらを正式に紹介し始めましょう。

[Application / x-www-form-urlencoded]
これは、POSTを介してデータを送信するための最も一般的な方法です。ブラウザのネイティブフォーム。enctype属性が設定されていない場合は、次のようになります。

POST http://www.example.com HTTP/1.1
Content-Type: application/x-www-form-urlencoded;charset=utf-8

title=test&sub%5B%5D=1&sub%5B%5D=2&sub%5B%5D=3

まず、Content-Typeはapplication / x-www-form-urlencodedとして指定されます。次に、送信されたデータはkey1 = val1&key2 = val2に従ってエンコードされ、keyとvalの両方がURLトランスコードされます。ほとんどのサーバー側言語は、このメソッドを適切にサポートしています。たとえば、PHPでは、POST ['title']はtitleの値を取得でき、_POST ['title']はtitleの値を取得できます。PO S T [ title ]おそれする取得得るTITLE値は_POST [」サブ「]サブアレイとすることができます。

多くの場合、Ajaxでデータを送信するときは、この方法も使用します。たとえば、JQueryのAjaxでは、Content-Typeのデフォルト値は
「application / x-www-form-urlencoded; charset = utf-8」です。

[Multipart / form-data]
これは、POSTデータ送信のもう1つの一般的な方法です。フォームを使用してファイルをアップロードする場合、フォームのenctypeはmultipart / form-dataと同じである必要があります。
[アプリケーション/ json]

application / jsonのContent-Typeは、確かに応答ヘッダーにとって見知らぬ人ではありません。実際、メッセージ本文がシリアル化されたJSON文字列であることをサーバーに通知するために、これを要求ヘッダーとして使用する人がますます増えています。JSON仕様の人気により、IEの下位バージョンを除くすべての主要なブラウザーはJSON.stringifyをネイティブにサポートし、サーバー側言語にもJSONを処理する関数があるため、JSONの使用に問題は発生しません。

JSON形式は、キーと値のペアよりもはるかに複雑な構造化データをサポートします。これも便利です。

【Text / xml】
送信プロトコルにHTTP、エンコード方式にXMLを使用したリモートコール仕様です。典型的なXML-RPCリクエストは次のようになります。

POST http://www.example.com HTTP/1.1 
Content-Type: text/xml

<?xml version="1.0"?>
<methodCall>
    <methodName>examples.getStateName</methodName>
    <params>
        <param>
            <value><i4>41</i4></value>
        </param>
    </params>
</methodCall>

XML-RPCプロトコルはシンプルで機能的であり、さまざまな言語で実装できます。また、WordPressのXML-RPC Api、検索エンジンのpingサービスなど、広く使用されています。JavaScriptには、この方法でデータの相互作用をサポートする既製のライブラリもあり、既存のXML-RPCサービスを十分にサポートできます。ただし、個人的にはXML構造がまだ肥大化しすぎており、一般的なシナリオでJSONを使用する方が柔軟で便利だと感じています。

(3)SpringMVCがPOSTリクエストを受信する方法

(1)デフォルトのコンテンツタイプ

Content-Typeは、デフォルトのフォームであるapplication / x-www-form-urlencodedで送信されます。
この送信方法は、送信用のフォームフォームの通常のPOSTリクエストを作成するための
ものです。コントローラーには2つのパラメーターが必要です。これは@RequestBodyに追加できないことに注意してください。そうしないと、405例外がスローされ、パラメーターが文字列と配列の形式でパラメーターに入力されます。

application / x-www-form-urlencoded受信方法:

1:@RequestParam(“ name”)

2:同じキー名文字列を使用して文字列名を受け取ります。名前は一致する必要があります

3:エンティティクラスを使用して受信します。一致した属性が値を挿入し、setgeterメソッドが必要であり、名前に一貫性がなく、挿入できません

4:request.getParameter( "name");を使用して受信します

(2)アプリケーション/ json

Content-Typeはapplication / jsonの形式で送信されます。
このように、json形式の文字列
送信する必要があります。コントローラーは文字列を使用してjson文字列を受け入れる
必要があります。注釈を使用する場合は、@ RequestBodyを追加する必要があります。
。リクエストフィールドの本文の内容を読み取り、この文字列をjsonからオブジェクトに逆シリアル化します。自動的にオブジェクトに変換する場合は、SpringMVC構成でjsonシリアル化ツールを構成する必要があります。

参照方法は次のとおりです。

1:@RequestBody文字列を使用して受信します。文字列に直接受信することはできません。この方法ではJSON文字列を受信します。自分で変換する必要があります。

2:@RequestBodyとPOJOの受信または文字列

3:@RequestBody Map <String、Object> json、Mapを使用して受信する方が便利で、VOオブジェクトを作成する必要はありません

4:ストリームからgetReader()またはgetInputStream()を手動で取得します。前のメソッドの最下層もこの方法で受信されるため、ストリームを繰り返すことはできません。

受信パラメータ:複数の単一属性を持つ1つのオブジェクト

(4)getParameter()getInputStream()とgetReader()の違い

request.getParameter()
request.getInputStream()
request.getReader()
これらの3つのメソッドはすべて、送信されたデータをリクエストオブジェクトから取得しますが、用途は異なります。

フォーム送信データのエンコード方法に応じて、さまざまな方法を選択してください。

HTMLのフォームフォームのキー属性enctype:

(1)Enctype = application / x-www-form-urlencoded
このエンコード方式は、デフォルトのエンコード方式です。
エンコードされた結果は通常、name = aaaa&password = bbbbのようにfield1 = value2&field2 = value2&...の形式になります。
一般的に使用されるフォームもこの方法でコーディングされます。サーブレットAPIは、このコーディングメソッドのデコードをサポートします。ユーザーフォームのフィールドとデータを取得するには、ServletRequestクラスのgetParameter()メソッドを呼び出すだけです。
短所:
このコーディング方法(application / x-www-form-urlencoded)は単純ですが、バイナリデータの大きなブロックを送信することはできません。

(2)マルチ
パート/フォームデータ2進数の大きなブロックなどのデータの場合、ブラウザは別のエンコード方法、つまり「マルチパート/フォームデータ」エンコード方法を使用します。

ブラウザは、データとファイルを一緒にフォームで簡単に送信できます。このエンコード方式では、最初にデータに表示できない文字列を区切り文字として定義し、それを使用して各データセグメントを区切ります。各データセグメントは、HTMLページフォームの入力領域に対応します。このデータセグメントの一部の情報。データセグメントのコンテンツがファイルの場合、Content-Type属性、次にデータ自体もあります。この方法でデータを送信する場合は、request.getInputStream(を使用する必要があります。 )またはrequest.getReader()を使用して送信済みデータを取得するには、request.getParameter()を使用して送信済みデータを取得できません。

ストリームは1回しか読み取れないため、request.getParameter()、request.getInputStream()、およびrequest.getReader()の3つのメソッドは競合しています。
例:
フォームのコンテンツがenctype = application / x-www-form-urlencodedでエンコードされている場合、パラメーターはrequest.getParameter()メソッドを呼び出して取得され、request.getInputStream()またはrequest.getReader()は次のようになります。 request.getParameter()が呼び出されたときに、システムがフォームで送信されたデータをストリームの形式で1回読み取る可能性があるため、ストリーム内のコンテンツに対して。

フォームの内容がenctype = multipart / form-dataでエンコードされている場合、最初にrequest.getParameter()を呼び出してもデータを取得できないため、request.getInputStream()またはrequestに対してrequest.getParameter()メソッドを呼び出します。 getReader()。)request.getParameter()メソッドが呼び出された場合でも、競合はありません。フォームのデータは、request.getInputStream()またはrequest.getReader()、およびrequest.getInputStream()を呼び出すことで取得できます。 )とrequest.getReader()が同じである応答を混合することはできません。混合すると、例外がスローされます。

httpリクエストには、ヘッダーと本文があります。ヘッダーを読み取るには、request.getHeader( "...");を使用して本文を読み取るには、request.getReader()を使用しますが、getReaderはBufferedReaderを取得します。文字列に変換されます。

 private static String getPostData(HttpServletRequest request) throws IOException {
    
    
     StringBuilder data = new StringBuilder();
     String line;
     BufferedReader reader;
     try {
    
    
         reader = request.getReader();
         while (null != (line = reader.readLine())) {
    
    
             data.append(line);
         }
     } catch (IOException ignored) {
    
    
         throw new IOException();
     }
     return data.toString();
 }

参照

https://imququ.com/post/four-ways-to-post-data-in-http.html

https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_types

おすすめ

転載: blog.csdn.net/Octopus21/article/details/110734658