web-dev-qa-db-ja.com

Jquery Ajax POSTで400の不正な要求エラーを取得しています

Jqueryを使用してAjax POSTリクエストを送信しようとしていますが、400の悪いリクエストエラーが発生しています。

ここに私のコードがあります:

$.ajax({
  type: 'POST',
  url: "http://localhost:8080/project/server/rest/subjects",
  data: {
    "subject:title":"Test Name",
    "subject:description":"Creating test subject to check POST method API",
    "sub:tags": ["facebook:work", "facebook:likes"],
    "sampleSize" : 10,
    "values": ["science", "machine-learning"]
  },
  error: function(e) {
    console.log(e);
  }
});

It Says:リクエストからリソースを構築できません。私は何が欠けていますか?

42
sachinjain024

最後に、間違いを見つけました。その理由は、送信するJSONデータを文字列化する必要があるからです。 XHRオブジェクトにコンテンツタイプとデータタイプを設定する必要があります。したがって、正しいバージョンは次のとおりです。

$.ajax({
  type: 'POST',
  url: "http://localhost:8080/project/server/rest/subjects",
  data: JSON.stringify({
    "subject:title":"Test Name",
    "subject:description":"Creating test subject to check POST method API",
    "sub:tags": ["facebook:work", "facebook:likes"],
    "sampleSize" : 10,
    "values": ["science", "machine-learning"]
  }),
  error: function(e) {
    console.log(e);
  },
  dataType: "json",
  contentType: "application/json"
});

他の誰かを助けるかもしれません。

89
sachinjain024

質問は少し古いですが...誰かがエラー400に直面した場合に備えて、それはまた、投稿リクエストへのパラメータとしてcsrfTokenを投稿する必要から来るかもしれません。

テンプレートのクラフトから名前と値を取得する必要があります。

<script type="text/javascript">
    window.csrfTokenName = "{{ craft.config.csrfTokenName|e('js') }}";
    window.csrfTokenValue = "{{ craft.request.csrfToken|e('js') }}";
</script>

リクエストで渡します

data: window.csrfTokenName+"="+window.csrfTokenValue
1
Benoît Schiex

次の関数を使用して、「データ」オブジェクトからクエリを作成する必要があります

function buildQuery(obj) {
        var Result= '';
        if(typeof(obj)== 'object') {
            jQuery.each(obj, function(key, value) {
                Result+= (Result) ? '&' : '';
                if(typeof(value)== 'object' && value.length) {
                    for(var i=0; i<value.length; i++) {
                        Result+= [key+'[]', encodeURIComponent(value[i])].join('=');
                    }
                } else {
                    Result+= [key, encodeURIComponent(value)].join('=');
                }
            });
        }
        return Result;
    }

そして次に進みます

var data= {
"subject:title":"Test Name",
"subject:description":"Creating test subject to check POST method API",
"sub:tags": ["facebook:work, facebook:likes"],
"sampleSize" : 10,
"values": ["science", "machine-learning"]
}

$.ajax({
  type: 'POST',
  url: "http://localhost:8080/project/server/rest/subjects",
  data: buildQuery(data),
  error: function(e) {
    console.log(e);
  }
});
0

はい。データを識別できないため、stringify the JSON data orlse 400 bad requestエラーが発生する必要があります。

400 Bad Request

要求の形式が正しくありません。ブラウザが、このサーバーが理解できないリクエストを送信しました。

さらに、content typedatatypeも追加する必要があります。そうでない場合は、415というUnsupported Media Typeエラーが発生します。

415サポートされていないメディアタイプ

これを試して。

var newData =   {
                  "subject:title":"Test Name",
                  "subject:description":"Creating test subject to check POST method API",
                  "sub:tags": ["facebook:work", "facebook:likes"],
                  "sampleSize" : 10,
                  "values": ["science", "machine-learning"]
                  };

var dataJson = JSON.stringify(newData);

$.ajax({
  type: 'POST',
  url: "http://localhost:8080/project/server/rest/subjects",
  data: dataJson,
  error: function(e) {
    console.log(e);
  },
  dataType: "json",
  contentType: "application/json"
});

この方法で、必要なデータを簡単に変更できます。 ajaxブロックの外側で定義されているので、混乱することはありません。

0
Dulith De Costa