Как сделать POST-запрос jsonp, который указывает contentType с jQuery? - PullRequest
37 голосов
/ 05 октября 2010

Мне нужно сделать POST-запрос jsonp с типом контента 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?

Ответы [ 3 ]

51 голосов
/ 05 октября 2010

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

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

7 голосов
/ 18 июля 2013

Используйте 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);
            }
        });

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

если PHP :

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" );
1 голос
/ 29 апреля 2013

Есть (взломанное) решение, которое я делал много раз, вы сможете отправлять сообщения с 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);
  }
});

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

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

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

jsonp

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

json

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

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

...