Подтвердить что ты не робот

Как использовать тип: "POST" в jsonp ajax call

Я использую JQuery ajax jsonp. Я получил ниже Код JQuery:

 $.ajax({  
        type:"GET",        
        url: "Login.aspx",  // Send the login info to this page
        data: str, 
        dataType: "jsonp", 
        timeout: 200000,
        jsonp:"skywardDetails",
        success: function(result)
        { 
             // Show 'Submit' Button
            $('#loginButton').show();

            // Hide Gif Spinning Rotator
            $('#ajaxloading').hide();  
         } 

    });  

Этот код работает нормально, я просто хочу отправить запрос как "POST" вместо "GET" . Пожалуйста, предложите, как я могу это достичь.

Спасибо

4b9b3361

Ответ 1

Вы не можете использовать POST с помощью JSONP... он просто не работает таким образом, он создает элемент <script> для извлечения данных... который должен быть запросом GET. Там не так много, что вы можете сделать, помимо публикации в своем собственном домене в качестве прокси-сервера, который размещается в другом... но пользователь не сможет сделать это напрямую и увидеть ответ, хотя.

Ответ 2

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

Ответ 3

Современные браузеры допускают междоменные запросы AJAX, которые называются Совместное использование ресурсов для разных источников (см. также этот документ для более короткого и более практичного введения), а последние версии jQuery поддерживают его из коробки; вам нужна относительно недавняя версия браузера (FF3.5 +, IE8 +, Safari 4+, Chrome4 +, без поддержки Opera AFAIK).

Ответ 5

Если вы просто хотите сделать форму POST на свой сайт с помощью $.ajax() (например, для эмуляции опыта AJAX), вы можете использовать Плагин формы jQuery. Однако, если вам нужно сделать POST-форму в другом домене или в своем собственном домене, но используя другой протокол (незащищенное размещение страницы http: на защищенной странице https:), вы столкнетесь с которые вы не сможете разрешить только с помощью jQuery (подробнее). В таких случаях вам нужно вывести большие пушки: YQL. Проще говоря, YQL - это веб-язык скремблирования с синтаксисом типа SQL, который позволяет запрашивать весь Интернет как одну большую таблицу. Как сейчас, по моему скромному мнению, YQL - единственный [простой] способ пойти, если вы хотите сделать кросс-доменную форму POSTing с использованием клиентского JavaScript.

В частности, вам нужно будет использовать YQL Открыть таблицу данных, содержащую Execute, чтобы это произошло. Для получения хорошего резюме о том, как это сделать, вы можете прочитать статью "Скремблировать HTML-документы, которые требуют данных POST с помощью YQL ". К счастью для нас, гуру YQL Кристиан Хейлманн уже создал Открыть таблицу данных, которая обрабатывает данные POST. Вы можете играть с христианской таблицей "htmlpost" на YQL Console. Здесь разбивка синтаксиса YQL:

  • select * - выберите все столбцы, похожие на SQL, но в этом случае столбцы представляют собой элементы XML или объекты JSON, возвращаемые запросом. В контексте соскабливания веб-страниц эти "столбцы" обычно соответствуют элементам HTML, поэтому, если вы хотите получить только заголовок страницы, вы должны использовать select head.title.
  • from htmlpost - какая таблица для запроса; в этом случае используйте таблицу открытых таблиц "htmlpost" (вы можете использовать свою собственную таблицу, если она не соответствует вашим потребностям).
  • url="..." - форма action URI.
  • postdata="..." - данные сериализованной формы.
  • xpath="..." - XPath узлов, которые вы хотите включить в ответ. Это действует как механизм фильтрации, поэтому, если вы хотите включить только теги <p>, вы должны использовать xpath="//p"; чтобы включить все, что вы использовали бы xpath="//*".

Нажмите "Тест", чтобы выполнить запрос YQL. После того, как вы довольны результатами, убедитесь, что (1) нажмите "JSON", чтобы установить формат ответа в JSON, и (2) снимите флажок "Диагностика", чтобы свести к минимуму размер полезной нагрузки JSON, удалив постороннюю диагностическую информацию. Самый важный бит - это URL-адрес внизу страницы - это URL-адрес, который вы используете в инструкции $.ajax().

Здесь я расскажу вам о том, как выполнить кросс-доменную форму POST с помощью запроса YQL, используя эту форму:

<form id="form-post" action="https://www.example.com/add/member" method="post">
  <input type="text" name="firstname">
  <input type="text" name="lastname">
  <button type="button" onclick="doSubmit()">Add Member</button>
</form>

Ваш JavaScript будет выглядеть так:

function doSubmit() {
  $.ajax({
    url: '//query.yahooapis.com/v1/public/yql?q=select%20*%20from%20htmlpost%20where%0Aurl%3D%22' +
         encodeURIComponent($('#form-post').attr('action')) + '%22%20%0Aand%20postdata%3D%22' +
         encodeURIComponent($('#form-post').serialize()) +
         '%22%20and%20xpath%3D%22%2F%2F*%22&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback=',
    dataType: 'json', /* Optional - jQuery autodetects this by default */
    success: function(response) {
      console.log(response);
    }
  });
}

Строка url - это URL-адрес запроса, скопированный из консоли YQL, за исключением закодированного в форму action URI и динамически вставленных сериализованных входных данных.

ПРИМЕЧАНИЕ.. Обратите внимание на последствия для безопасности при передаче конфиденциальной информации через Интернет. Убедитесь, что страница, в которой вы передаете конфиденциальную информацию, безопасна (https:) и используя TLS 1.x вместо SSL 3.0.

Ответ 6

Вот JSONP, который я написал, чтобы делиться со всеми:

страницу для отправки req
http://c64.tw/r20/eqDiv/fr64.html

пожалуйста, сохраните srec ниже .html youself
 c64.tw/r20/eqDiv/src/fr64.txt
страницы, чтобы ответить, пожалуйста, сохраните srec ниже .jsp youself
 c64.tw/r20/eqDiv/src/doFr64.txt

или встроенный код на вашей странице:

функция callbackForJsonp (resp) {

var elemDivResp = $("#idForDivResp");
elemDivResp.empty();

try {

    elemDivResp.html($("#idForF1").val() + " + " + $("#idForF2").val() + "<br/>");
    elemDivResp.append(" = " + resp.ans + "<br/>");
    elemDivResp.append(" = " + resp.ans2 + "<br/>");

} catch (e) {

    alert("callbackForJsonp=" + e);

}

}

$(document).ready(function() {

var testUrl = "http://c64.tw/r20/eqDiv/doFr64.jsp?callback=?";

$(document.body).prepend("post to " + testUrl + "<br/><br/>");

$("#idForBtnToGo").click(function() {

    $.ajax({

        url : testUrl,
        type : "POST",

        data : {
            f1 : $("#idForF1").val(),
            f2 : $("#idForF2").val(),
            op : "add"
        },

        dataType : "jsonp",
        crossDomain : true,
        //jsonpCallback : "callbackForJsonp",
        success : callbackForJsonp,

        //success : function(resp) {

        //console.log("Yes, you success");
        //callbackForJsonp(resp);

        //},

        error : function(XMLHttpRequest, status, err) {

            console.log(XMLHttpRequest.status + "\n" + err);
            //alert(XMLHttpRequest.status + "\n" + err);

        }

    });

});

});