Ajax调用Android而不是iOS

时间:2017-12-07 15:59:29

标签: ios ajax http fetch nativescript

我是第一次在Nativescript中开发一个应用程序并遇到一个问题,其中AJAX调用在Android而不是iOS上运行。我有一个login.js文件需要一个用户视图模型(user-view-model.js),当我在Android上测试代码时,它会带我进入“home”页面,但它会触及iOS上的catch功能

login.js:

var dialogsModule = require("ui/dialogs");
var UserViewModel = require("../../shared/view-models/user-view-model");
var applicationSettings = require("application-settings");

var user = new UserViewModel({ 
  email: "aaa@aaa.com", 
  password: "aaa" 
});

var frameModule = require("ui/frame");
var page;

exports.loaded = function(args) {
  page = args.object;
  page.bindingContext = user;
};

exports.login = function () {
  user.login().catch(function(error) {
    dialogsModule.alert({
      message: "Unfortunately we could not find your account.",
      okButtonText: "OK"
    });
    return Promise.reject();
  }).then(function(response) {
    console.dir(response)
    console.log("past response")
    applicationSettings.setString("user_id", response.user_id);
    applicationSettings.setString("first_name", response.first_name);
    applicationSettings.setString("last_name", response.last_name);
    applicationSettings.setString("user_type", response.user_type);
    var topmost = frameModule.topmost();
    topmost.navigate("views/home/home");
  });
};

用户 - 视图 - model.js:

var config = require("../../shared/config");
var fetchModule = require("fetch");
var observableModule = require("data/observable");
var http = require("http");

function User(info) {
    info = info || {};

    var viewModel = new observableModule.fromObject({
        email: info.email || "",
        password: info.password || ""
    });

    viewModel.login = function() {
        let loginEmail = JSON.stringify(this.get("email")).replace(/['"]+/g, '');
        let loginPassword = JSON.stringify(this.get("password")).replace(/['"]+/g, '');
        console.log(loginEmail, loginPassword);
        let loginUrl = config.serverPHPServiceUrl + "Login.php?user_id=" + loginEmail + "&password=" + loginPassword;
        console.log(loginUrl);
    
        // I tried this way first and wasn't able to login on iOS, which made me try the second method below.
        // return fetchModule.fetch(loginUrl, {
        //   method: "POST",
        //   headers: {
        //     "Content-Type": "application/json"
        //   }
        // }).then(handleErrors).then(function(response) {
        //   return response.json();
        // }).then(function(data) {
        //   console.dir(data);
        //   console.log(data["results"][0]["user_id"])
        //   return data["results"][0];
        // });

        // This method works on Android but not iOS.
        return http.getJSON(loginUrl).then(function(response) {
              console.dir(response);
              return response.results[0];
        })

    };

    return viewModel;
};

function handleErrors(response) {
    console.log("in errors")
    if (!response.ok) {
        console.log(JSON.stringify(response));
        throw Error(response.statusText);
    }
    return response;
}

module.exports = User;

我的代码有什么根本性的错误,或者在Nativescript中iOS和Android上的异步调用有什么不同吗?我做了Grocery教程并没有遇到这个问题,所以我不认为是这种情况。后端使用PHP是否重要?

1 个答案:

答案 0 :(得分:0)

我修复了我的问题:我使用Angular 2启动了一个新项目并遇到了同样的错误,但后来它给了我错误消息“错误:无法加载资源,因为App Transport Security策略需要使用一个安全的连接。“我通过在我的网址调用中添加“https”解决了这个问题,但this post还有其他解决方案。