0

サーバー上のWebリソースで「application/json」ファイルを@Consumeする(正しく)方法を探して、インターネットを少しグーグルで検索しました。

私はglassfishアプリサーバーを使用しているので、Javaリソースです。

呼び出し元の javascvript コードは次のとおりです。

        var url="/MBC/pages/lives/";
        var mygetrequest=new ajaxRequest();
        mygetrequest.onreadystatechange=function(){
         if (mygetrequest.readyState==4){
          if (mygetrequest.status==200 || window.location.href.indexOf("http")==-1){
              var render="";

              var JsonIn =JSON.parse(mygetrequest.responseText);

              if(JsonIn.error==undefined){
                    render="generic error"; 
                  }
               }else
                  render=mygetrequest.responseText  ;

               document.getElementById(div).innerHTML=render;

            }else{
           render="An error has occured making the request";
          } 
        };
        var json2Send = "{" +
                "boss:\""+location.href.substring(location.href.length-5,location.href.length-4)+"\"," ;
        if(document.newLive.bval.value=='')
            json2Send+="bands:[],";
        else
            json2Send+="bands:["+document.newLive.bval.value+"],";

        json2Send+="data:\""+document.newLive.dateEvent.value+"\"," +
                "address:{street:\""+document.newLive.street.value+"\"," +
                        "number:\""+document.newLive.number.value+"\"," +
                        "city:\""+document.newLive.city.value+"\"," +
                        "region:\""+document.newLive.region.value+"\"," +
                        "state:\""+document.newLive.state.value+"\"}" +
                "}";
        mygetrequest.open("POST", url, true);
        mygetrequest.setRequestHeader("Content-type", "application/json");
        mygetrequest.send(json2Send);

ここで、json2Send は、クライアントがサーバーに送信する必要がある json 文字列です。

代わりに、サーバー側のコードを次に示します。

@POST
@Path("configLiveBand")
@Consumes("application/json")
@Produces("application/json")
public String liveBandInsert(String jsonIn, @Context HttpServletRequest request) throws ParseException{

サーバーがJavaScriptからの入力json文字列を読み取れるようにするために、何をしなければならないかを尋ねています。明らかに、上で説明した方法は機能しません。サーバーが戻ります

HTTP Status 405 -

type Status report

message

descriptionThe specified HTTP method is not allowed for the requested resource ().

インターネットで私の問題を調べたところ、「BufferedReader」クラスの「readline()」メソッドを含む解決策が見つかりました。私はこの解決策が好きではありません。方法がある場合は、入力文字列を1行ずつ読み取る代わりにjsonファイルを挿入することをお勧めします。

どんな助けでも受け入れられます ありがとう

4

2 に答える 2

0

Philippが書いたように、問題はjsonでした:

json2Send+="\"data\":\""+document.newLive.dateEvent.value+"\"," +
        "\"address\":{\"street\":\""+document.newLive.street.value+"\"," +
                "\"number\":\""+document.newLive.number.value+"\"," +
                "\"city\":\""+document.newLive.city.value+"\"," +
                "\"region\":\""+document.newLive.region.value+"\"," +
                "\"state\":\""+document.newLive.state.value+"\"}" +
        "}";

それ以外の

json2Send+="data:\""+document.newLive.dateEvent.value+"\"," +
        "address:{street:\""+document.newLive.street.value+"\"," +
                "number:\""+document.newLive.number.value+"\"," +
                "city:\""+document.newLive.city.value+"\"," +
                "region:\""+document.newLive.region.value+"\"," +
                "state:\""+document.newLive.state.value+"\"}" +
        "}";

これで、json の結果を読み取って投稿し、クライアントに送り返すことができます。;-) ありがとうフィリップ

于 2012-06-25T21:21:09.493 に答える
0

お役に立てて嬉しいです。

json2Send文字列の連結ではなく、実際の Javascript Object Notation (JSON) を使用して構築することをお勧めします。たとえば、次のようになります。

// This creates an "empty" JS object, with no properties.
var json2Send = new Object();
var length = location.href.length;
// Adding a property is as easy as just setting it, it will be created by this.
json2Send.boss = location.href.substring(length - 5, length - 4);
if (document.newLive.bval.value == '') {
  json2Send.bands = [];
} else {
  json2Send.bands = [document.newLive.bval.value];
}
json2Send.data = document.newLive.dateEvent.value;
// Properties can also be other objects, here created with the
// object literal notation of { key:value, ...}.
json2Send.address = {
  // Inside, it's just another JS object again,
  // this time setting properties with literal notation key:value
  // Note how there's no need to quote anything here!
  street: document.newLive.street.value,
  number: document.newLive.number.value,
  city: document.newLive.city.value,
  region: document.newLive.region.value,
  state: document.newLive.state.value
};

次に、次のように HTTP POST の文字列に変換します。

mygetrequest.open("POST", url, true);
mygetrequest.setRequestHeader("Content-type", "application/json");
mygetrequest.send(JSON.stringify(json2Send));

これにより、構文エラーがはるかに早く検出され、さまざまな部分をすべて手動で引用する必要がなくなり、おそらくより高速になり、全体がより堅牢になります。

于 2012-06-25T22:27:49.300 に答える