对本地网络服务器的 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 处理对 /updateGET 请求。如果您想将其作为POST 处理,请使用app.post(...)

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

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

    1234563不同的行为。

【讨论】:

是的。理想情况下,我会发回适当的回复以确认包裹已正确处理......但是,我不应该看到 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 请求的主要内容,如果未能解决你的问题,请参考以下文章

使用Node置服务器,对本地文件进行操作

在反应中对本地快递服务器进行邮政呼叫

如何处理网络中间请求的变化 - Alamofire

尝试对本地 Web api(离子 android 应用程序)的 http 请求时连接被拒绝

使用 Alamofire 的无效证书、表单数据和 HTTP 标头数据

在 Alamofire 中检测缓存的响应