2016-08-18 15 views
2

REST APIに投稿しようとしているjQueryを実行している本当にシンプルなHTMLページがあります。ここに私のコードです。jQuery.AJAXはPOSTの代わりにGETを使用します。

<script type="text/javascript" language="javascript"> 
    var user = 'someuser'; 
    var pass = 'somepassword'; 
    var payload = { 
     "value1": "first value", 
     "value2": "second value" 
    }; 
    var rootUrl = 'http://someinternalserver:8888/api/Method'; 
</script> 
<script language="javascript" type="text/javascript" id="postWtnBlock"> 
    function postValue_Go() { 
     $.ajax({ 
      url: rootUrl, 
      // Removing the next line or changing the value to 'JSON' results in an OPTIONS request. 
      dataType: 'JSONP', 
      data: JSON.stringify(payload), 
      method: 'POST', 
      user: user, 
      password: pass, 
      beforeSend: function (req) { 
       req.setRequestHeader('Authorization', 'BASIC ' + btoa(user + ':' + pass)); 
      }, 
      success: function (data) { 
       alert(data); 
      }, 
      error: function (xhr) { 
       alert(xhr.status + ' ' + xhr.statusText); 
      } 
     }); 
    } 
</script> 

ここでは2つのことが起こっています。

1)リクエストはすべてPOSTではなくGETリクエストとして送信されています。 2)承認ヘッダーは決して要求にそれを入れません。それは常に欠けている。

これはなぜわかりません。

更新#1:

POST http://someinternalserver:8888/api/Method/ HTTP/1.1 
Host: someinternalserver:8888 
Connection: keep-alive 
Content-Length: 693 
Accept: */* 
Origin: http://devserver 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36 
Content-Type: application/x-www-form-urlencoded; charset=UTF-8 
Referer: http://devserver/samples/ExternalAPI/ 
Accept-Encoding: gzip, deflate 
Accept-Language: en-US,en;q=0.8 
Cookie: someCookieValue=Boo; someOtherCookieValue=Yum; 

{"value1": "first value","value2": "second value"} 

と生応答:新しいpostValue_Goは()

function postValue_Go() { 
     $.ajax({ 
      url: rootUrl, 
      data: JSON.stringify(payload), 
      method: 'POST', 
      username: user, 
      password: pass, 
      xhrFields: { 
       withCredentials: true 
      }, 
      success: function (data) { 
       alert(data); 
      }, 
      error: function (xhr) { 
       alert(xhr.status + ' ' + xhr.statusText); 
      } 
     }); 
    } 

...次のようになります。ここフィドラーで撮影した生の要求は、ですそれはフィドラーでも捕らえられました。 JSONPが、その後にバンドルされたすべての要求されたデータとスクリプトを返します(GETリクエストを実行する)Webサービスを指すsrc属性を使用してウェブページにスクリプトを追加しますので、それはGETリクエストとして送信されています

HTTP/1.1 401 Unauthorized 
Cache-Control: no-cache 
Pragma: no-cache 
Content-Type: application/json; charset=utf-8 
Expires: -1 
Server: Microsoft-IIS/7.5 
X-AspNet-Version: 4.0.30319 
X-Powered-By: ASP.NET 
Date: Fri, 19 Aug 2016 17:12:29 GMT 
Content-Length: 61 

{"Message":"Authorization has been denied for this request."} 
+0

これはapi return jsonpですか?なぜあなたは[http://stackoverflow.com/questions/7613815/callback-function-for-jsonp-with-jquery-ajax](jsonpコールバック)を追加しなかったのですか?あなたは画面、ネットワーク - > xhrを共有できますか? –

+0

データ型を 'JSONP'から' JSON'に変更すると、その質問はOPTIONSリクエストになります。 – amber

+1

JSONPはGETリクエストで、JSONPの仕組みです。 – epascarello

答えて

0

コールバック関数。

iframeなどで深刻な脚の作業をしたい場合は、JSONPを使用してPOSTリクエストを実行することは可能ですが(hereを参照)、ほとんどの目的と目的でGETリクエストに限定されます。

現在、ページに追加するスクリプト用に送信されたヘッダーを変更する方法がないため、承認ヘッダーは設定されません。

+0

'JSONP'を削除した場合、生成されたリクエストは' OPTIONS'リクエストになります。 – amber

+1

@amber私はあなたがカスタムヘッダーを設定しているからだと思います。 [here](https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Preflighted_requests) – stevenelberger

+0

これは何かをしました。私は 'beforeSend'ハンドラをコメントアウトし、実際に' POST'を取得しましたが、サーバは401 Not Authorizedで戻ってきました。生の要求を見ると、 'user'と' password'設定値で設定された認証情報は表示されません。 – amber

関連する問題