$http angularjs 调用未使用 Worklight 从移动设备执行

Posted

技术标签:

【中文标题】$http angularjs 调用未使用 Worklight 从移动设备执行【英文标题】:$http angularjs calls not executing from Mobile Device with Worklight 【发布时间】:2015-01-06 16:55:47 【问题描述】:

我不知道这是否真的是特定于工作灯的。但是在 ios/移动设备上,这个 $http 调用没有执行(或者至少看起来不像)。

我没有达到success 点或error 点。监视网络流量时,我看不到正在发出请求。你看到这里的问题了吗,是工作灯,有角度的吗?

我试图添加scope.apply 并更改请求参数。我用 jquery/ajax 尝试了类似的代码,但得到了类似的结果。

此外,当我在桌面浏览器(非移动)环境中对此进行测试时,调用工作正常。您看到什么可以纠正 $http 调用未执行的问题吗?

var deferred = $q.defer();
var httplogout = function() 
    $http(
        method: 'post',
        url: 'https://server.com/logout',
        data: ,
        timeout: 8000
    ).then(function(data)         
        deferred.resolve();
    , function(err)              
        deferred.reject();
    );

    return deferred.promise();
;

$timeout(function() 
    $scope.$apply(function() 
        httplogout().then(function()         
            WL.Logger.debug('Done');
        );
    );
    , 
1);

【问题讨论】:

尝试使用 $hhtp.post(url) 。 $timeout 和 $apply();你不需要那个,你在 angulars 摘要循环中 【参考方案1】:

您正在执行跨域请求,可能应该使用$http.jsonphttps://docs.angularjs.org/api/ng/service/$http#jsonp。您可以通过查看开发者控制台来查看这是否是问题所在,您应该会看到与 HTTP 请求相关的跨域异常

您可以查看此页面以获取更多信息http://msdn.microsoft.com/en-us/library/cc709423%28v=vs.85%29.aspx#xdomainsec_secconcernswebapiwg,但基本上,您还应确保您的服务器设置了正确的标头以允许跨域请求并处理 JSONP 回调。

这里是一些 Node.js/Express 代码,用于在响应中设置这些标头(并且还处理 JSONP 回调)

function sendResponse(req, res, data) 
    res.setHeader('Access-Control-Allow-Origin', req.headers && req.headers.origin ? req.headers.origin : '*');
    res.setHeader('Access-Control-Allow-Credentials', 'true');
    res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
    if (req.query.callback) 
        res.setHeader('Content-Type', 'text/javascript');
        var response = req.query.callback + '(' +
            JSON.stringify(data) +
            ');';
        res.send(response);
     else 
        res.setHeader('Content-Type', 'application/json');
        res.send(data);
    

您还应该实现 OPTIONS HTTP 请求(这里是一些 Node.js/Express 代码)

app.options('*',
    function(req, res) 
        sendResponse(req, res, );
    );

【讨论】:

所有worklight移动设备请求都是跨域的吗?我没有看到跨域异常。没有错误。 看起来它可能与移动设备相关(与cordova、phonegap有关)。这似乎是一个奇怪的错误,因为我看不到该代码执行。 Worklight 基本上是 Cordova,周围有 IBM 的东西。答案是 - 是的 - 所有对外部服务器的请求都将被视为跨域请求,因为您的 UI 页面是从 file:// URL 提供的 我猜想在幕后,ibm 正在通过其工作灯适配器调用隐藏跨域支持。在这种情况下,我正在发出一个普通的 ajax 请求。 jsonp 是实现这种跨域方法的唯一方法吗?

以上是关于$http angularjs 调用未使用 Worklight 从移动设备执行的主要内容,如果未能解决你的问题,请参考以下文章

AngularJS指令$ scope未定义

Angularjs 如何对 $http 调用进行正确的错误处理?

angularJS + mongoose:TypeError:无法读取未定义的属性“模型”

AngularJS 中的 401 未经授权的错误处理

AngularJS $http 对象未显示响应中的所有标头

调用 $(".myItem").dateInput() 后 angularjs 输入字段未更新