Междоменный сервер ajax на REST с помощью jQuery - PullRequest
0 голосов
/ 29 февраля 2012

В StackOverflow есть много тесно связанных с этим вопросов, но, пожалуйста, оставайтесь со мной.

Вот сценарий: я создаю мобильное приложение, используя PhoneGap. Так эффективно я пишу приложение на jQuery Mobile, HTML и CSS.

Вот проблема: сервер является реализацией REST. Это означает, что для создания новой «сущности» (например, пользователь, машина, горячая детка) сервер прослушивает POST-запросы. Если сервер будет отвечать на запросы GET, возвращая существующие «сущности».

Как заставить мобильное приложение отправлять POST-запрос от jQuery? Это звучит просто, но имейте в виду, что jQuery изменит запрос типа данных jsonp на GET, даже если вы укажете POST. Кроме того, имейте в виду, что сервер и приложение не находятся в одном домене, поэтому этот запрос отправляется между доменами, поэтому установка типа данных для json не будет работать.

Я застрял с этим в течение 4 долгих часов. Я могу заставить его работать в мгновение ока, если я забочусь только о GET-запросах, но получение POST на сервере до сих пор оказалось невозможным.

Вот упрощение серверного кода:

 class GatewayService extends Service[Request, Response] {
   def apply(request: Request) = {
     request.method -> Path(request.path) match {
       case GET -> Root / "car" => {
         println("---Get car---")
       }
       case POST -> Root / "car" => {
         println("---New car---")
       }
       case _ => {
         println("---Other method type ---")
      }
    }
}

А вот код jQuery:

function serverRequest(formId, url) {
    var result = ""
    var formData = readFormData(formId);
    console.log("Submitting form:\n"+JSON.stringify(formData));

    $.ajax({
        type:"POST",
        url: url,
        data: JSON.stringify(formData),
       dataType: "json",
        success: function(response){
            alert(response['message']);
            console.log("Received response: "+JSON.stringify(response));
            result = response;
         },
         error: function(jqXHR, textStatus, errorThrown){
             console.log(
                 "The following error occured: "+ jqXHR,
                 textStatus, errorThrown
             );
         },
         complete: function(){
             //Nothing here for now
         }
    });
    return result;
}

Если у вас есть идеи по получению кросс-домена POST-запросов с помощью jQuery, поделитесь секретом.

Обновление:

Пока что кажется, что вы не можете просто получить доступ к REST-серверу напрямую из мобильного приложения, разработанного на jQuery Mobile. Это правильно?

Ответы [ 2 ]

2 голосов
/ 29 февраля 2012

Вы пытались использовать CORS вместо использования JSONP? Это должно поддерживаться всеми современными браузерами (и, следовательно, надеюсь, телефонный разрыв тоже). Этот пост относится к этому: https://stackoverflow.com/a/8773095/773339

JSONP ограничен только GET.

0 голосов
/ 29 февраля 2012

Как вы также знаете, вы не можете отправить запрос JSON или JSONP как запрос POST. Запрос JSON или JSONP всегда является запросом GET. Чтобы обойти это, вы можете опубликовать на странице своего домена, а затем использовать эту страницу для публикации данных. Как:


var data ="url=http://www.example.com/post_url.php&parameters=1&para=2";
 $.ajax({
  url: "your_domain_url",
  data: data,
  type: "POST",
  success: function(data, textStatus, jqXHR){
    console.log('Success ' + data);
  },
  error: function (jqXHR, textStatus, errorThrown){
    console.log('Error ' + jqXHR);
  }
});

Получить данные публикации в файле, который существует в вашем домене, и опубликовать их оттуда Надеюсь, это поможет.

...