1

私は、STS ダッシュボードからダウンロード可能な Spring MVC ショーケースの例について勉強しています。

今回は、この例のコンバーター セクションについて学習していて、いくつか質問があります。

まず、私の見解では、次の 2 つのリンクがあります。

<li>
    <a id="writeJsonAccept" class="writeJsonLink" href="<c:url value="/messageconverters/json" />">Write JSON via Accept=application/json</a>
</li>

<li>
    <a id="writeJsonExt" class="writeJsonLink" href="<c:url value="messageconverters/json" />">Write JSON via ".json"</a>
</li>

最初のリンクは、URL への HTTP リクエストを生成します: messageconverters/json

2 番目のリンクは、URL への HTTP リクエストを生成します: /messageconverters/json.json (最初の URL とは異なり、このリンクは .json拡張子で終わります)

これらのリンクはどちらもclass="writeJsonLink"を持ち、これらのリンクのクリック イベントに関連して、次の JQuery コールバック関数が呼び出されます。

$("a.writeJsonLink").click(function() {

    var link = $(this);                      

    $.ajax({ 
        url: this.href,  

        beforeSend: function(req) { 

            if (!this.url.match(/\.json$/)) { 
                req.setRequestHeader("Accept", "application/json");          
            }
        },
        success: function(json) {
            MvcUtil.showSuccessResponse(JSON.stringify(json), link);
        },
        error: function(xhr) {  
            MvcUtil.showErrorResponse(xhr.responseText, link);
        }});
    return false;
});

この関数は AJAX 呼び出しのみを実行し、HTTP 応答がそのコンテンツをハンドラーに渡してビューに出力を表示するのを待ちます...わかりました...

リクエストを送信する前に、関数は URL が .json 拡張子で終わっていないかどうかをチェックします

このリクエストが .json 拡張子で終わらない場合、次のヘッダーが HTTP リクエストに追加されます。

受け入れる = アプリケーション/json

私が知っていることから、Accept ヘッダーは、HTTP 応答に対してどの特定のメディア タイプがかなり受け入れられるかを示しています。

この Request は、Jaxb2RootElementHttpMessageConverter を使用して JSON 形式に変換される評価済みオブジェクトを返すコントローラー クラスの次のメソッドから処理されます。

@RequestMapping(value="/json", method=RequestMethod.GET)
public ResponseEntity<JavaBean> writeJson() {

    // Oggetto che rappresenta gli HTTP Header dell'HTTP Response
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.TEXT_PLAIN);
    return new ResponseEntity<JavaBean>(new JavaBean("bar", "apple"), headers , HttpStatus.OK);

// return new JavaBean("bar", "apple"); }

さて、私の質問は、2 つのリンクの違いについてです。

最初のものは .json拡張子で終わっていないため、Accept ヘッダーが追加され、ブラウザーが JSON オブジェクトの受信を期待していると言ってapplication/json に設定されます

2 つ目は .json拡張子で終わるため、Jquery メソッドは Accept ヘッダーを設定しません。

しかし、これはどういう意味ですか?URL が .json で終わると、Accept ヘッダーが自動的に設定されますか? または、より一般的には、ある種の拡張子 (.xml など) で終わる URL がある場合、相対的な Accept ヘッダーが自動的に設定されますか?

または、単純にこの 2 番目のケースでは、Accept ヘッダーを設定しないでください。つまり、HTTP 応答の本文で受信できるメディア タイプを処理しないということですか?

4

1 に答える 1

1

わかりました、あなたの英語力はそれほど高くないので、できる限りのお手伝いをさせてください。

私の理解では、これは非常に間違っている可能性がありますが、URL が json で終わるときにブラウザが Accept: ヘッダーを json に設定するかどうかを知りたいですか? 私はこれが事実だとは思わない。私はこれについて大きく誤解しているかもしれませんが、Firebug や Chrome の Developer Tools などを使用してこれをテストできます。または、IE が好きなら Fiddler を入手して、ブラウザーから送信されるヘッダーを正確に確認してください。

ここで、Spring が魔法のようにそこにヘッダーを配置するかどうかを尋ねている場合、答えは「いいえ」だと思います。リクエストの HTTP ヘッダーはブラウザーから取得されます。サーブレット フィルターなどを使用してリクエスト フィルターを設定することもできますが、すべてのブラウザーがこれらのリクエスト ヘッダーを同じように処理すると仮定するのは危険だと思います。

いいえ、「私のリクエストはどのようにしてコントローラーの writeJson() メソッドに到達するのですか?」という質問であれば、その答えは「Accept」ヘッダーとはまったく関係ありません。あなたのメソッドは /json で終わるすべての URI パターンに一致しており、どちらの場合も URL は /json で終わります。JSONの「Accept」ヘッダーを持つものをフィルタリングしたい場合は、次のようにしたいと思います:

@RequestMapping(value="/someUriPattern", headers = {"Accept=application/json"})

上記は記憶から書いたものなので、少し調整する必要があるかもしれません。

于 2013-01-17T16:00:57.130 に答える