2017-07-10 14 views
1

バニラJS(jQueryなし)でPOSTメソッドを動作させる方法を教えてください。REST API - バニラのPOSTメソッドJavaScript/AJAX - エラー400(不正リクエスト)

私はこのコードでそれをやろうとしています:

var call = 
{ 
    "filterParameters": { 
    "id": 18855843, 
    "isInStockOnly": false, 
    "newsOnly": false, 
    "wearType": 0, 
    "orderBy": 0, 
    "page": 1, 
    "params": { 
     "tId": 0, 
     "v": [] 
    }, 
    "producers": [], 
    "sendPrices": true, 
    "type": "action", 
    "typeId": "", 
    "branchId": "" 
    } 
}; 
var xhr = new XMLHttpRequest(); 

xhr.open('POST', 'https://www.alza.cz/Services/RestService.svc/v2/products'); 
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); 
xhr.onload = function() { 
    if (xhr.status === 200) { 
     console.log('OK ' + xhr.responseText); 
    } 
    else if (xhr.status !== 200) { 
     console.log('Request failed. Returned status of ' + xhr.status); 
    } 
}; 
xhr.send(call); 

、常にエラー400(不正な要求)を取得。 私はjQueryでそれを呼び出そうとしましたが、それは動作していますが、私はそれを普通のJSで動作させる必要があります。

どうしてうまくいかないのですか?これは、サーバーのデータにアクセスするAJAXのJavaScriptコードを遮断するアクセス制御 - 許可 - 起源の応答です

addData({ 
    "filterParameters": { 
    "id": 18855843, 
    "isInStockOnly": false, 
    "newsOnly": false, 
    "wearType": 0, 
    "orderBy": 0, 
    "page": 1, 
    "params": { 
     "tId": 0, 
     "v": [] 
    }, 
    "producers": [], 
    "sendPrices": true, 
    "type": "action", 
    "typeId": "", 
    "branchId": "" 
    } 
} 
); 

function addData(data){// pass your data in method 
    $.ajax({ 
      type: "POST", 
      url: "https://www.alza.cz/Services/RestService.svc/v2/products", 
      data: JSON.stringify(data),// now data come in this function 
      contentType: "application/json; charset=utf-8", 
      crossDomain: true, 
      dataType: "json", 
      success: function (data, status, jqXHR) { 

       console.log(data);// write success in " " 
      }, 

      error: function (jqXHR, status) { 
       // error handler 
       console.log(jqXHR); 
       alert('fail' + status.code); 
      } 
      }); 
    } 
+0

私はあなたが 'JSON.stringify(コール)は' –

+0

@Tomosウィリアムズは先端をありがとうする必要があると思う、I 'xhr.send(JSON.stringify(call));を試してみましたが、運がいいわけではありません。まだエラー400 –

+0

あなたは何を得ていますか? ブラウザの開発者ツールの[ネットワーク]タブでリクエストのプレビューを確認できますか? – JeBokE

答えて

2

あなたがapplication/json
あなたは間違っているFORMDATAとしてJSONデータを掲載しているにcontent-typeヘッダを設定する必要があります

xhr.setRequestHeader('Content-Type', 'application/json');

相続人が使用して実施例である(あなたのオブジェクトを文字列化するために忘れてしまったの横)新しいバニラjsがAPIフェッチ

var result = null 

fetch("https://www.alza.cz/Services/RestService.svc/v2/products", { 
    method: "POST", 
    body: JSON.stringify({ 
    "filterParameters": { 
     "id": 18855843, 
     "isInStockOnly": false, 
     "newsOnly": false, 
     "wearType": 0, 
     "orderBy": 0, 
     "page": 1, 
     "params": { 
     "tId": 0, 
     "v": [] 
     }, 
     "producers": [], 
     "sendPrices": true, 
     "type": "action", 
     "typeId": "", 
     "branchId": "" 
    } 
    }), 
    headers: {"content-type": "application/json"}, 
    //credentials: 'include' 
}) 
.then(function(res) { 
    if (res.ok) { // ok if status is 2xx 
    console.log('OK ' + res.statusText); 
    } else { 
    console.log('Request failed. Returned status of ' + res.status); 
    } 

    return res.blob() 
}) 
.then(function(blob) { 
    result = blob 
    // window.result = blob 
}) 
+0

は素晴らしい、魅力的な作品です。どうもありがとうございます! –

+0

クロムエクステンションを使用した場合、私はfetch api(IE btwではサポートされていません)を使って書くことができます。個人的にはXHRでフェッチ/約束を好む – Endless

+0

Access Control-Allow-OriginブロックはJSONの代わりにJSONPを使用しています... –

0

は、チェックのために、ここでのjQueryで作業コードです。サーバーがあなたによって制御されていない場合は、データを取得してからWebページにリダイレクトできる別のサーバーが必要です。

+0

エラーではありません - CORSプラグインを使用してChromeでセキュリティ設定を上書きしました(https://chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi?hl = en) –

0

だから、僕はxhr.send()

を試してみましたが、私は空白のタブでこれをしようとした場合、それは実際に動作しかし

XMLHttpRequest cannot load https://www.alza.cz/Services/RestService.svc/v2/products. Response to preflight request doesn't pass access control check: The 'Access-Control-Allow-Origin' header has a value 'http://www.alza.cz' that is not equal to the supplied origin. 

を得ました。 あなたはこのURLからJSを実行しようとしていますか?

空白のタブからJSを実行してみてください。

+0

エラーではありません - CORSプラグイン(https://chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi?hl=ja)を使用してChromeでセキュリティ設定を上書きしました。私はエラー400を取得しています。ここにスクリーンショット(https://s4.postimg.org/xkqxiiqq5/Sn_mek_obrazovky_2017-07-10_v_15.37.32.png) –

関連する問題