Restful解析posf方式パラメータ伝達

3443 ワード

詳細
結論:
restfulスタイルのインタフェースは複数のパラメータ注をサポートしない:本稿ではjsonシーケンス化パラメータの場合1を指す.テスト用のMyParamクラスを定義しておきます

public class MyParam {
    private String str;
    private Integer integer;
    //   getter setter……
    }

私がテストをしているのはChromeのプラグインAdvanced REST clientを使って、ブラウザが各種の要求を送信することをシミュレートして、headerとbodyをカスタマイズすることができます.テスト時にpost方式を使用し、httpリクエストヘッダに追加する必要があります.

accept: application/json
content-type: application/json

次に、httpリクエストのBodyに、{"str":"bb","integer":3}のようなjson形式のパラメータを入力します.以下に、いくつかのマルチパラメータインタフェースの形式と、入力パラメータ、および解析結果を示します.2.第1種:2つのStringパラメータ

@POST
@Path("demo")
public Result function(String param1, String param2);

入力パラメータ:
{"param1":"bb","param2":"cc"} 

解析されたパラメータ:
param1: "{"param1":"bb","param2":"cc"}"
param2: ""

このようなスタイルでは、転送されたパラメータは、読み取り時にrequest bodyのinputStreamを読み取り、2つのパラメータをループ解析して、1つ目のパラメータを解析したときにinputStreamを閉じ、2つ目のパラメータがinputStreamを読み取るときに空になります.すると、入力されたパラメータはすべて1番目のStringオブジェクトに割り当てられ、2番目のStringが解析されると空の文字列になります.3.2つ目:1つのオブジェクトパラメータ、1つのStringパラメータが1つ目のパラメータがカプセル化されたオブジェクトの場合、1つ目のオブジェクトを解析することができ、2つ目のパラメータも取得できません.この場合はエラーは報告されませんが、最初のオブジェクトを解析するときは問題ありません.2番目のStringを解析すると空の文字列が得られます.
@POST
@Path("demo")
@Consumes({MediaType.JSON})
public Result function(MyParam myParam, String param);

入力パラメータ:
{"str":"helo","integer":2},"string":"test"

解析されたパラメータ:
param1:  myParam, 。
param2: ""

4.第三の種類:一つのStringパラメータ、一つのオブジェクトパラメータが二つのパラメータの位置を交換すると、入ってきたパラメータを全部第一のStringに解析し、第二のオブジェクトを解析する時、もらったデータが空であるため、エラーを報告する.次のようになります.
@POST
@Path("demo")
public Result function(String param, MyParam myParam);

入力パラメータ:
{"str":"helo","integer":2},"string":"test" 

解析されたパラメータ:
param1: "{"str":"helo","integer":2},"string":"test""
param2:  

5.解決方法複数のパラメータを伝達する問題を解決するには、いくつかの構想がある:1.オブジェクトをカプセル化し、伝達する複数のパラメータを1つのオブジェクトにカプセル化して伝達する.アクセスパスに変数を埋め込み、@PathVariable注記を使用してリクエストパスに「/demo/{1}/{2}」と書き、リクエストパスの対応する位置で着るパラメータに置き換えるとよい.これはStringなどのパッケージクラスにも適用される.3.要求のcontent typeを変更し、content-type:application/x-www-form-urlencodedを使用します.このformフォームを使用してコミットする形式では、@Form Param注釈6を使用する2つのパラメータを入力できます.form形式でパラメータインタフェースに入力する定義形式について変更する
@POST
@Path("demo")
@Consumes({MediaType.APPLICATION_FORM_URLENCODED})
public Result function(@FormParam(value="string1")String string1, @FormParam(value="string2")String string2);

リクエスト時にheaderパラメータを変更するには
accept: application/json
content-type: application/x-www-form-urlencoded

要求Bodyでform形式を使用する
string1=wo&string2=kan

2つのパラメータの値で解析されたパラメータを正しく解析できます.
string1: wo
string2: kan