【问题标题】:Cross-Domain ajax to REST server with jQuery使用 jQuery 跨域 ajax 到 REST 服务器
【发布时间】:2012-02-29 08:51:49
【问题描述】:

我正在使用 PhoneGap 创建一个移动应用程序。如此有效地我正在用 jQuery Mobile、HTML 和 CSS 编写应用程序。

问题是:服务器是一个 REST 实现。这意味着要创建一个新的“实体”(例如用户、汽车、热宝贝),服务器会监听 POST 请求。如果服务器将通过返回现有的“实体”来响应 GET 请求。

如何让移动应用程序从 jQuery 发送 POST 请求?这听起来很简单,但请记住,即使您指定 POST,jQuery 也会将 jsonp 数据类型请求更改为 GET。另外请注意,服务器和应用不在同一个域,所以这个请求是跨域发送的,所以设置数据类型为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;
}

如果您对使用 jQuery 获取跨域 POST 请求有任何想法,请分享您的秘密。

看来您不能简单地直接从基于 jQuery Mobile 开发的移动应用程序访问 REST 服务器。这是正确的吗?

【问题讨论】:

    标签: jquery jquery-mobile cordova


    【解决方案1】:

    您是否尝试使用 CORS 而不是 JSONP?所有现代浏览器都应该支持这一点(因此也希望 phonegap 也支持)。本帖与之相关:https://stackoverflow.com/a/8773095/773339

    JSONP 仅限于 GET。

    【讨论】:

    • EasyXDM 是一个很棒的 CORS 实现,就像 PhoneGap 的魅力一样。但是,您需要控制 Web 服务。 easyxdm.net/wp
    • 谢谢大家。我会调查一下。移动设备(使用 jQuery Mobile)和现有 REST 服务器之间的集成在任何方面都应该是复杂的,这让我仍然感到有些震惊。
    【解决方案2】:

    您也知道,您不能将 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); } });

    在您的域中存在的文件中获取发布数据并从那里发布。 希望在某种程度上有所帮助。

    【讨论】:

    • 它确实提供了一些思考的食物,谢谢。但这并不理想。我真的认为从移动设备访问 REST 服务应该非常简单,即使是使用 jQuery Mobile 和 PhoneGap 开发的服务
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-23
    • 2012-01-30
    • 1970-01-01
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    相关资源
    最近更新 更多