Alamofire http请求到本地网络服务器

时间:2015-02-05 22:29:04

标签: ios express alamofire

我正在开发一个iPhone应用程序,计划是每隔一段时间从应用程序向本地网络服务器发送一个JSON数据包。为此,我计划使用Alamofire。我的POST方法如下所示:

Alamofire.request(Alamofire.Method.POST, "http://XXX.XX.X.XX:3000/update", parameters: dictPoints, encoding: .JSON)
    .responseJSON {(request, response, JSON, error) in
    println(JSON)
}

IP地址已标记出来,但我已确保这对应于本地服务器的IPv4无线地址。服务器设置为侦听端口3000.服务器配置如下所示:

var express = require('express');
var app = express();
var mongoose = require('mongoose');

mongoose.connect('mongodb://localhost/test');

var db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function (callback) {
  console.log("MongoDB connection is open.");
});

// Mongoose Schema definition
var Schema = mongoose.Schema;
var LocationSchema = new Schema({
    //some schema here
});

// Mongoose Model definition
var LocationsCollection = mongoose.model('locations', LocationSchema);

// URL management
app.get('/', function (req, res) {
    res.sendFile(__dirname + '/index.html');
});

app.get('/update', function (req, res) {
    console.log("Got something from the phone!");
});

// Start the server
var server = app.listen(3000, function () {
  var host = server.address().address
  var port = server.address().port
  console.log('App listening at %s:%s',host, port)
})

所以,这台服务器似乎工作正常。我可以在浏览器中对其进行测试并输入网址:http://127.0.0.1:3000,它会向我提供index.html文件。如果我输入http://127.0.0.1:3000/update ...那么我会得到“从电话里得到的东西!”信息。但是,当我运行我的应用程序(确保我的手机与服务器在同一个无线网络上)并且Alamofire方法被调用时......我得到的响应为零。我也没有看到“从电话里得到的东西!”信息。任何人都可以让我知道为什么会发生这种情况......或者更好的是,如何解决它?

3 个答案:

答案 0 :(得分:5)

一些想法:

  1. 您正在Alamofire中创建POST请求,但您已告知Express处理GET /update次请求。如果您想将其作为app.post(...)处理,请使用POST

  2. 您的Alamofire代码正在寻找JSON响应,但您似乎没有创建JSON响应。在短期内,您可以使用responseString而不是responseJSON,但我认为您确实希望更改您的Web服务以使用JSON进行响应(以使应用程序更容易解析响应)。

  3. 您的Alamofire代码发送JSON请求(但很明显,当您通过Web浏览器发送请求时,它不是JSON)。您确定要发送JSON请求吗? (这不应与JSON响应问题混淆。)您是否要使用.URL编码类型参数,而不是.JSON

  4. 每当您的请求在Web浏览器中正常运行,而不是从应用程序运行时,使用Charles之类的工具同时观察它们会很有用,然后您可以比较它们的不同之处并诊断它们不同行为的来源。

答案 1 :(得分:2)

如果您在同一台计算机上运行Express服务器和iOS模拟器,请尝试使用http://0.0.0.0:<port>/<url>而不是实际IP,这在我的情况下有所帮助。

答案 2 :(得分:0)

听起来节点服务器没有绑定到您期望的地址。当您在Web浏览器中的“http://XXX.XX.X.XX:3000/update”中键入实际IP地址时,您应该验证它是否响应。您的问题详细信息表明您刚刚使用了环回地址。