it-roy-ru.com

Как сделать JSONP POST запрос, который указывает contentType с jQuery?

Мне нужно сделать запрос jsonp POST с типом контента application/json. Я могу получить запрос 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", он начинает посылать ее как запрос OPTIONS, а не как POST.

Как я могу указать тип контента и при этом отправить запрос как POST?

37
Marcus

Невозможно сделать запрос JSONP POST.

JSONP работает путем создания тега <script>, который выполняет Javascript из другого домена; невозможно отправить запрос POST с помощью тега <script>.

51
SLaks

Используйте json в dataType и отправьте так:

        $.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);
            }
        });

и поместите эти строки в ваш файл на стороне сервера:

ifPHP:

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

если Java:

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

Есть (взломанное) решение, которое я делал много раз, вы сможете публиковать сообщения с помощью JsonP . (Вы сможете публиковать форму размером более 2000 символов, которую вы можете использовать в GET)

Клиентское приложение 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);
  }
});

Джава:

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');

Поступая так, вы открываете свой сервер для любого почтового запроса, вы должны повторно защитить его, предоставив идентификатор или что-то еще.

С помощью этого метода вы также можете изменить тип запроса с jsonp на json, оба работают, просто установите правильный тип содержимого ответа

JSONP

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

JSON

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

Обратите внимание, что ваш сервер больше не будет уважать SOP (та же политика происхождения), но кого это волнует?

1
Dimitri Kopriwa