0

JSONオブジェクトをパラメーターとして送信しようとしています。

localhost:8080/HelloWorldApplication/webresources/helloworld/get/{param}

このプロセス中に、次のような大きなJSONオブジェクトを送信します。

{"follow_request_sent": false, "profile_use_background_image": true, "contributors_enabled": false, "id": 200, "verified": false, "profile_image_url_https": "https://si0.twimg.com/sticky/default_profile_images/default_profile_4_normal.png", "profile_sidebar_fill_color": "e0ff92", "is_translator": false, "profile_text_color": "000000", "followers_count": 869, "profile_sidebar_border_color": "87bc44", "id_str": "200", "default_profile_image": true, "listed_count": 0, "status": {"favorited": false, "contributors": null, "truncated": false, "text": "http://goo.gl/OkfpC", "created_at": "2010-12-07T05:58:01", "retweeted": false, "in_reply_to_status_id": null, "coordinates": null, "source_url": "http://mobile.twitter.com", "source": "Mobile Web", "in_reply_to_status_id_str": null, "in_reply_to_screen_name": null, "in_reply_to_user_id": null, "id": 12023002585628672, "place": null, "retweet_count": 0, "geo": null, "in_reply_to_user_id_str": null, "possibly_sensitive": false, "id_str": "12023002585628672"}, "utc_offset": -28800, "statuses_count": 6, "description": "", "friends_count": 4, "location": "", "profile_link_color": "0000ff", "profile_image_url": "http://a0.twimg.com/sticky/default_profile_images/default_profile_4_normal.png", "notifications": false, "show_all_inline_media": false, "geo_enabled": true, "profile_background_color": "9ae4e8", "profile_background_image_url": "http://a0.twimg.com/images/themes/theme1/bg.png", "name": "Dalbir Singh", "lang": "en", "profile_background_tile": false, "favourites_count": 0, "screen_name": "dalbirsingh", "url": null, "created_at": "2006-04-29T01:00:27", "profile_background_image_url_https": "https://si0.twimg.com/images/themes/theme1/bg.png", "time_zone": "Pacific Time (US & Canada)", "protected": false, "default_profile": false, "following": false}

私のコードは、パラメータの数が少なくなるまではうまく機能しますが、上記のような大きなオブジェクトでは機能しません。httpリクエストを介して送信されるJSONobjectまたはその他のパラメータの長さに制限はありますか?ある場合、それを変更する方法。

コード:

@GET 
    @Path("/get/{empno}")// this method process GET request from client
    @Produces("application/json")   // sends JSON
    public String getJson(@PathParam("empno") JSONObject p) {  // empno represents the empno sent from client   
        JSONObject obj = p;
        String x = obj.toString();
        System.out.println(x);
        //some function
        return "x";

   }
4

2 に答える 2

1

はい、URLの長さに制限があります。ただし、ブラウザとWebサーバーによって異なります(通常は構成可能ですが、変更することはお勧めできません...)。

通常、URLが2000文字未満の場合は、常に機能するはずです。このスレッドもご覧ください。さまざまなブラウザでのURLの最大長はどれくらいですか。 そして、他のいくつかのリンクはHTTP GETリクエストの最大長ですか?http://www.boutell.com/newfaq/misc/urllength.html

とにかくあなたがしていることは悪い習慣です。URLにjsonを渡さないでください。jsonは投稿リクエストの本文として使用する必要があります。リクエストパラメータとしてjsonを使用することは、実際にはRESTスタイルではありません。URLパラメータがREST apiで問題ないかどうかについての議論がありますが、それは議論の余地があります...

編集 投稿があり、データバインディングをサポートするライブラリを使用するジャージの例:

gensonライブラリhttp://code.google.com/p/genson/をダウンロードします。クラスパスにある場合、jsonデータバインディングは自動的にジャージに対して有効になります。json入力(私はそれをARequestBeanと呼びました)とjsonにシリアル化される応答を含むAResponseBeanに対応するクラスを定義します。

@POST 
@Path("/post")
@Consumes(("application/json") // consumes JSON
@Produces("application/json")   // sends JSON
public AResponseBean getJson(ARequestBean request) {
  return ...;
}
于 2012-10-25T11:30:40.430 に答える
0

GETリクエストは、IEブラウザによって約2k文字に制限されていました。それ以来、ブラウザは少し進化したようで、それに伴って制限が大きくなりました。

GETリクエストのサイズに関する質問(ここを参照:GETリクエストの長さに制限はありますか?)に対して、誰かが次のように回答しました。

サーバー側でIE8、IE9、FF14、Opera11、Chrome20、Tomcat 6.0.32(新規インストール)、Jersey1.13を使用してさらにテストを行いました。jQuery関数$.getJsonとJSONPを使用しました。結果:すべてのブラウザで最大約5400文字が許可されました。FFとIE9は最大約6200文字を実行しました。上記のすべてが「400Badrequest」を返しました。400の原因をさらに調査することはしませんでした。私の場合、約2000文字が必要だったので、見つけた最大値で問題ありませんでした。–OneWorld7月30日18:58

したがって、あなたの質問に対する答えは、JSONの制限ではなく、GETの制限であるということです。オブジェクトをURLに配置する代わりにPOSTする場合は、問題ないはずです。

デザインですべてをURLに入れる必要があり、それが非常に大きなURLである場合は、デザインを再検討する必要があります。サーバー側で状態を保存し、IDのみを渡す必要があります。

于 2012-10-25T11:29:23.230 に答える