web-dev-qa-db-ja.com

jsonp POST jQueryでcontentTypeを指定するリクエストを作成するには?

コンテンツタイプ「application/json」でjsonp POSTリクエストを行う必要があります。次のようにサーバーへのPOSTリクエストを取得できます。

      jQuery.ajax({
        type: 'POST',
        url: url,
        data: data,
        success: success,
        error: error,
        async: true,
        complete: complete,
        timeout: TIMEOUT,
        scriptCharset: 'UTF-8',
        dataType: 'jsonp',
        jsonp: '_jsonp',
      });

しかし、次の行を追加するとすぐに_contentType: "application/json"、POSTではなくOPTIONSリクエストとして送信を開始します。

コンテンツタイプを指定し、リクエストをPOSTとして送信するにはどうすればよいですか?

38
Marcus

JSONP POSTリクエストを作成することはできません。

JSONPは、異なるドメインからJavascriptを実行する<script>タグを作成することにより機能します。 <script>タグを使用してPOST=リクエストを送信することはできません。

51
SLaks

jsondataTypeを使用し、次のように送信します。

        $.ajax({
            url: "your url which return json",
            type: "POST",
            crossDomain: true,
            data: data,
            dataType: "json",
            success:function(result){
                alert(JSON.stringify(result));
            },
            error:function(xhr,status,error){
                alert(status);
            }
        });

サーバー側のファイルに次の行を追加します。

if [〜#〜] php [〜#〜]

header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST');
header('Access-Control-Max-Age: 1000');

if Java:

response.addHeader( "Access-Control-Allow-Origin", "*" ); 
response.addHeader( "Access-Control-Allow-Methods", "POST" ); 
response.addHeader( "Access-Control-Max-Age", "1000" );

私が何度もやってきた(ハック)ソリューションがあります。JsonPで投稿できます。 (GETで使用できるよりも大きい2000文字を超えるフォームを投稿できます)

クライアントアプリケーションJavascript

$.ajax({
  type: "POST", // you request will be a post request
  data: postData, // javascript object with all my params
  url: COMAPIURL, // my backoffice comunication api url
  dataType: "jsonp", // datatype can be json or jsonp
  success: function(result){
    console.dir(result);
  }
});

Java:

response.addHeader( "Access-Control-Allow-Origin", "*" ); // open your api to any client 
response.addHeader( "Access-Control-Allow-Methods", "POST" ); // a allow post
response.addHeader( "Access-Control-Max-Age", "1000" ); // time from request to response before timeout

PHP:

header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST');
header('Access-Control-Max-Age: 1000');

このようにして、投稿リクエストに対してサーバーを開いているので、identまたは何か他のものを提供することでこれを再保護する必要があります。

この方法では、リクエストタイプをjsonpからjsonに変更することもできます。両方とも機能し、正しいレスポンスコンテンツタイプを設定するだけです

jsonp

response.setContentType( "text/javascript; charset=utf-8" );

json

response.setContentType( "application/json; charset=utf-8" );

サーバーがSOP(同じOriginポリシー))をこれ以上尊重しないことに注意してください。

1
Dimitri Kopriwa