2009-10-16 3 views
5

Я пытаюсь выполнить запрос POST для перекрестного домена и ударил стену (или две).Синхронный запрос по подпоследовательности поддомены с jQuery

Я не могу поместить прокси-страницу на сервер - так что это не вариант.

Я исследовал getJSON, который отлично работает, за исключением того, что мне нужно ПОЧТАТЬ НЕ ПОЛУЧИТЬ.

Возможно ли это? Если это не, может кто-нибудь объяснить мне, как работает getJSON и почему я не могу сделать альтернативу POST.

ответ

26

Вы CANNOT сделать запрос междоменная (GET/POST/и т.д.) с XMLHttpRequest (ака AJAX).

Что вы можете сделать, когда сервер поддерживает его, сделать запрос JSONP. Запрос JSONP работает следующим образом:

  • JQuery создает глобально доступную функцию из функции обратного вызова, которую Вы предоставляете в качестве аргумента
  • Вместо использования XMLHttpRequest (AJAX), чтобы сделать запрос HTTP, JQuery динамически вставляет SCRIPT тег в DOM
  • Пульт SRC тега сценария является запрос URL, к которому вы пытаетесь общаться
  • JQuery добавляет обратный вызов параметров в строку запроса, как так: example.com/someurl.js?callback=someDynamicallyGeneratedMethodName
  • Именно тогда к серверу для возврата JavaScript, что ваш клиент может использовать, передавая результат JSON как аргумент someDynamicallyGeneratedMethodName

Если у вас нет контроля над сервером, который вы отправляете сообщение, то вам не повезло, JSONP выиграл «Тебе хорошо. Независимо от того, что возвращает сервер, он будет находиться в теге SCRIPT и, скорее всего, выдает ошибку, если он не отформатирован правильно.

Для получения дополнительной информации, я предлагаю вам посмотреть на базовую функцию $ .ajax вместо ярлыков. (В документации jQuery под Ajax. Извините, я не могу опубликовать дополнительные ссылки)

Опять же, если у вас нет контроля над сервером, на который вы отправляете сообщения, возможно, вам захочется заглянуть в прокси-сервер, если это возможно. В противном случае IFRAME может быть вашим единственным другим вариантом. Существует также способ выполнить это с помощью SWF (flash) объекта. Я не пробовал ни одного, но они обходные пути к ограничениям объекта XMLHttpRequest.

Надеюсь, что смогу помочь!

+0

+1. Отличная почта, и добро пожаловать в СО! – aolde

+0

Спасибо за объяснение. После этого это стало намного яснее, чем час Googling. У меня есть доступ к серверу, который я отправляю, так что все хорошо. –

+2

Err, как этот комментарий относится к теме? Это не распространяется на POST, который специально спрашивает OT! – HRJ

2

Вы можете сделать сообщение, но то, что вы хотите, - это запрос JSONP, чтобы обойти проблемы с перекрестным доменом. По сути, вы предоставляете функцию обратного вызова, и запрос возвращается в виде содержимого сценария, и ваш обратный вызов вызывается с данными JSON из запроса. Сценарий на стороне сервера должен будет предоставить данные обратно как вызов функции, используя функцию обратного вызова, обернутую вокруг объекта JSON.

См. Документацию по функции post.

$.post('/example.com/controller/action?callback=?', 
     { param: "data" }, 
     function(data) { 
      ...do something with the data... 
     }, 'jsonp'); 

действие ASP.NET MVC для этого:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Action(string param, string callback) 
{ 
    var jsonData = ...do something and construct some data in JSON... 

    return Content(callback + "(" + jsonData + ");"); 
} 
+1

Для справок в будущем: похоже, Google Chrome 6.0.472.63 не нравится это слишком много. В Safari обрабатывает возвращенный JSON, но Chrome просто показывает, что «Исходный null не разрешен Access-Control-Allow-Origin». сообщение. – Cimm

0

Если вы хотите сделать перекрестный домен POST, самым простым решением является то, что Matteo предоставил here. Это сработало отлично для меня