Cordova iOS发送HEAD请求而不是POST

时间:2018-09-12 21:19:53

标签: ios cordova ionic-framework nsurlconnection

我正在运行一个带有简单登录屏幕的ionic v1应用程序,该屏幕带有用户名和密码,并通过HTTP对远程API进行POST。成功登录后,用户将转到应用程序的主屏幕。

当我在任何Android设备上部署应用程序时,它都可以正常工作。但是,当我在任何ios设备上部署相同的应用程序时,单击“登录”按钮没有任何作用。当我检查xcode日志时,它会显示

IC TCP Conn Failed [3:0x600000173e00]: 1:60 Err(60)
2018-09-13 02:16:07.004607+0530 MyApp[15053:1613654] Task <5E324292-7D81-481B-B905-2522BC11A23E>.<0> HTTP load failed (error code: -1001 [1:60])
2018-09-13 02:16:07.005251+0530 MyApp [15053:1612177] NSURLConnection finished with error - code -1001

NSLURLConnection错误1001表示超时。因此,我检查了Web服务器日志以验证曾经向API发送的请求。 我看到请求到达了服务器。服务器日志显示所有ios设备上的登录请求都将生成HEAD请求而不是POST。这样一来,网络服务器就会将HTML页面返回到请求,应用程序由于期望JSON响应而无法对其进行进一步处理。

从任何ios设备登录时的Web服务器日志

[root@ip-10-0-0-151 log]# cat production.log 
I, [2018-09-12T20:38:35.976774 #12603]  INFO -- : Started HEAD "/users/sign_in" for 69.162.124.237 at 2018-09-12 20:38:35 +0000
I, [2018-09-12T20:38:35.977758 #12603]  INFO -- : Processing by Devise::SessionsController#new as HTML
I, [2018-09-12T20:38:35.979483 #12603]  INFO -- :   Rendering devise/sessions/new.html.erb within layouts/login
I, [2018-09-12T20:38:35.981128 #12603]  INFO -- :   Rendered devise/shared/_links.html.erb (0.3ms)
I, [2018-09-12T20:38:35.981456 #12603]  INFO -- :   Rendered devise/sessions/new.html.erb within layouts/login (1.9ms)
I, [2018-09-12T20:38:35.981987 #12603]  INFO -- : Completed 200 OK in 4ms (Views: 2.7ms | ActiveRecord: 0.0ms)

Web服务器从任何Android设备登录时登录。这项工作和应用程序用户进入主屏幕。这说明API正常工作。请注意,iOS设备的第一个请求(HEAD)和Android设备的第一个请求(POST)有所不同。

[root@ip-10-0-0-151 log]# cat production.log 
I, [2018-09-12T20:39:25.064640 #12603]  INFO -- : Started POST "/api/users/sign_in" for 110.227.177.4 at 2018-09-12 20:39:25 +0000
I, [2018-09-12T20:39:25.065825 #12603]  INFO -- : Processing by Api::SessionsController#create as HTML
I, [2018-09-12T20:39:25.065903 #12603]  INFO -- :   Parameters: {"user"=>{"email"=>"johndoe@gmail.com", "password"=>"[FILTERED]"}, "request_type"=>"json", "session"=>{"user"=>{"email"=>"johndoe@gmail.com", "password"=>"[FILTERED]"}, "request_type"=>"json"}}

离子js代码

    $scope.login = function() {
        $http({
            method: 'POST',
            headers: 
             {
                'Content-Type': 'application/json',
             },
            url: config.apiUrl+"users/sign_in",
            data: {user: {email: $scope.data.email, password: $scope.data.password}, request_type: 'json' }

        }).then(function successCallback(response) {
                $state.go('tab.nearby');

}, function(err) {
                alert('code: '    + err.code    + '\n' +
                    'message: ' + err.message + '\n');
                console.log(err);
                $state.go('tab.nearby');
            });


            }, function errorCallback(response) {
                // called asynchronously if an error occurs
                // or server returns response with an error status.

                $ionicPopup.alert({
                    title: 'Problem with authentication',
                    template: '<div style="text-align:center">'+response.data.message+'</div>',

                });
            });

所以,我的麻烦是,如果代码是跨平台的并且可以在android设备上正常工作,为什么ios会生成不同的行为?可能是什么原因造成的?

0 个答案:

没有答案