2015-02-05 76 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,這對我有幫助。