对本地网络服务器的 Alamofire http 请求
Posted
技术标签:
【中文标题】对本地网络服务器的 Alamofire http 请求【英文标题】:Alamofire http request to local webserver 【发布时间】:2015-02-05 22:29:03 【问题描述】:我正在开发一个 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)
)
所以,这台服务器似乎工作正常。我可以在我的浏览器中测试它并输入 URL:http://127.0.0.1:3000,它会为我提供 index.html 文件。如果我输入http://127.0.0.1:3000/update...然后我会得到“从电话里拿东西!”信息。但是,当我运行我的应用程序(确保我的手机与服务器在同一个无线网络上)并且调用 Alamofire 方法时......我得到的响应是零。我也没有看到“从电话里得到了一些东西!”信息。谁能告诉我为什么会发生这种情况......或者更好的是,如何解决它?
【问题讨论】:
【参考方案1】:一些想法:
您正在 Alamofire 中创建 POST
请求,但您已告诉 Express 处理对 /update
的 GET
请求。如果您想将其作为POST
处理,请使用app.post(...)
。
您的 Alamofire 代码正在寻找 JSON 响应,但您似乎没有创建 JSON 响应。在短期内,您可以使用responseString
而不是responseJSON
,但我认为您确实想更改您的网络服务以使用 JSON 响应(以便应用程序更容易解析响应)。
您的 Alamofire 代码发送 JSON 请求(但很明显,当您通过 Web 浏览器发送请求时,它不是 JSON)。您确定要发送 JSON 请求吗? (不要与 JSON 响应问题混淆。)您是否要使用 .URL
编码类型参数,而不是 .JSON
?
【讨论】:
是的。理想情况下,我会发回适当的回复以确认包裹已正确处理......但是,我不应该看到 console.log 消息说它从手机收到了一些东西吗?现在,我只是想看看我从手机发送的消息是否被手机注册(之后我可以解析消息并发送回正确的响应)。 我将 Alamofire 函数更改为使用.responseString
而不是 .responseJSON
,我得到的消息如下:Optional("Cannot POST /update\n")
。当我这样做时,我也在使用 Charles,我没有看到日志中出现任何活动(但是当我将 IP 地址输入计算机上的网络浏览器时,我确实看到了一条记录)。你知道 Alamofire 的响应是什么意思,或者为什么它不会发布到那个地址?
@andyopayne 也许是app.get
参考。如果您想处理POST
对/update
的请求,那不应该是app.post
吗?
嗯...修复了"Cannot POST /update\n"
消息...但是,我仍然没有收到"Got Something From the Phone!"
消息...而且,查尔斯似乎没有报告任何http手机运行并发送 JSON 数据包时的活动(我知道这一点,因为我看到响应字符串返回)。 http 请求似乎永远不会到达网络服务器......但正如我所说......我可以在浏览器中输入网络服务器的地址(使用端口),它工作得很好。有什么建议吗?
实际上...我认为我没有更改服务器代码中的任何内容(除了将其更改为 app.post),但它现在似乎正在工作。当电话拨打 Alamofire 电话时,我可以看到“电话里有东西!”我的控制台中的消息。所以,我认为它现在正在正常工作。现在,继续解析 JSON 消息...但是,谢谢您的帮助。【参考方案2】:
如果您在同一台机器上运行 Express 服务器和 ios 模拟器,请尝试使用 http://0.0.0.0:<port>/<url>
而不是实际 IP,这对我来说很有帮助。
【讨论】:
【参考方案3】:听起来节点服务器未绑定到您期望的地址。您应该验证,当您在 Web 浏览器的“http://XXX.XX.X.XX:3000/update”中输入实际 IP 地址时,它会响应。您的问题详细信息表明您刚刚使用了环回地址。
【讨论】:
我确实已经确认,当我输入带有端口号的实际 IPv4 地址时,它确实提供了正确的页面。所以,我已经尝试了 127.0.0.1:300 以及我的 IPv4 地址:端口,这两种方法都按预期工作。此外,我尝试在另一台计算机(客户端和服务器在不同的计算机上)的网络浏览器中使用 IPv4 地址和端口,我可以让网络服务器正确地提供 index.html。所以,据我所知,这部分似乎工作正常。以上是关于对本地网络服务器的 Alamofire http 请求的主要内容,如果未能解决你的问题,请参考以下文章
尝试对本地 Web api(离子 android 应用程序)的 http 请求时连接被拒绝