Как использовать тип: "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" . Пожалуйста, предложите, как я могу это достичь.
Спасибо
Ответы
Ответ 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).
Ответ 4
JsonP работает только с типом: GET,
Дополнительная информация (PHP) http://www.fbloggs.com/2010/07/09/how-to-access-cross-domain-data-with-ajax-using-jsonp-jquery-and-php/
.NET: http://www.west-wind.com/weblog/posts/2007/Jul/04/JSONP-for-crosssite-Callbacks
Ответ 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);
}
});
});
});