2015-02-05 72 views
5

我正在开发一个iPhone应用程序,并计划每隔一段时间从应用程序发送一个JSON数据包到本地网络服务器。为此,我计划使用Alamofire。我的POST方法是这样的:Alamofire http请求本地网络服务器

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方法被调用时...我得到的响应是零。我也看不到“从手机里拿到东西!”信息。任何人都可以让我知道为什么会发生......或者更好的是,如何解决它?

回答

5

的一点想法:

  1. 你正在创造一个Alamofire要求POST,但你告诉快递处理GET请求/update。如果您想将其作为POST来处理,请使用app.post(...)

  2. 您的Alamofire代码正在寻找JSON响应,但您似乎并未创建JSON响应。在短期内,您可以使用responseString而不是responseJSON,但我认为您确实想要更改您的Web服务以使用JSON进行响应(以便应用程序更轻松地解析响应)。

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

  4. 只要你有来自Web浏览器正常工作的请求,而不是从应用程序,它都使用的工具,像Charles看是有用的,那么你就可以比较它们之间的区别和诊断的不同行为的根源。

+0

是的。理想情况下,我会发送适当的响应,以确认该程序包的处理过程是否正确......但是,我不应该看到console.log消息说明它收到了手机中的某些内容吗?现在,我只是试图查看我从手机发送的消息是否被手机注册过(之后我可以解析消息并发回正确的响应)。 – andyopayne 2015-02-05 22:37:29

+0

我将Alamofire函数改为使用'.responseString'而不是'.responseJSON',并且我得到的消息如下:'Optional(“不能POST/update \ n”)'。当我这样做时,我也正在使用Charles,而且我没有看到日志中显示任何活动(但是,当我将IP地址输入到计算机上的webrowser时,我看到了一条记录)。你知道Alamofire的回应意味着什么,或者为什么它不会发布到该地址? – andyopayne 2015-02-06 14:50:53

+1

@andyopayne也许它是'app.get'的参考。如果你想处理'/ update'的'POST'请求​​,它不应该是'app.post'吗? – Rob 2015-02-06 14:57:36

0

听起来好像节点服务器没有绑定到你期望的地址。您应该确认,当您在您的网页浏览器中输入“http://XXX.XX.X.XX:3000/update”中的实际IP地址时,它会响应。你的问题细节表明你刚刚使用了回送地址。

+0

我确实已经确认,当我输入具有端口号的实际IPv4地址时,它确实提供了正确的页面。所以,我尝试了127.0.0.1:300以及我的IPv4地址:端口,两种方法都按预期工作。另外,我尝试在另一台计算机上使用带有端口的网络浏览器的IPv4地址(客户端和服务器位于不同的计算机上),我可以让网络服务器正确提供index.html。所以,据我所知,看起来这部分工作正常。 – andyopayne 2015-02-06 14:27:01

2

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