2015-02-05 7 views
5

Zajmuję się tworzeniem aplikacji na iPhone'a i planuję wysłać pakiet JSON co jakiś czas z aplikacji na lokalny serwer internetowy. Aby to zrobić, planowałem użyć Alamofire. Moja metoda POST wygląda następująco:Żądanie Alamofire http do lokalnego serwera WWW

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

Adres IP jest wytyczona, ale zrobiłem pewien, że ta odpowiada bezprzewodowej adres IPv4 mojego lokalnego serwera. Serwer jest ustawiony na nasłuchuje na porcie 3000. Konfiguracja serwera wygląda następująco:

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) 
}) 

Więc ten serwer wydaje się działać ok. Mogę przetestować go w mojej przeglądarce i wpisać adres URL: http://127.0.0.1:3000, który dostarczy mi plik index.html. Jeśli wpiszę http://127.0.0.1:3000/update ... wtedy otrzymam komunikat "Mam coś z telefonu!" wiadomość. Jednak po uruchomieniu aplikacji (upewniając się, że mój telefon znajduje się w tej samej sieci bezprzewodowej co serwer), a metoda Alamofire zostaje wywołana ... odpowiedź, którą otrzymuję, jest zerowa. Nie widzę też "Masz coś z telefonu!" wiadomość. Czy ktoś może mi powiedzieć, dlaczego tak się dzieje ... lub jeszcze lepiej, jak to naprawić?

Odpowiedz

5

Kilka myśli:

  1. Ty tworzysz POST wniosek w Alamofire, ale mówiłeś Express do obsługi GET prośby o /update. Użyj app.post(...), jeśli chcesz obsłużyć go jako POST.

  2. Twój kod Alamofire szuka odpowiedzi JSON, ale wydaje się, że nie tworzysz odpowiedzi JSON. W krótkim okresie możesz użyć numeru responseString zamiast responseJSON, ale domyślam się, że naprawdę chcesz zmienić swoją usługę sieciową, aby odpowiedział JSON (aby ułatwić analizowanie odpowiedzi przez aplikację).

  3. Twój kod Alamofire wysyła żądanie JSON (ale wyraźnie, gdy wyślesz żądanie przez przeglądarkę internetową, to nie jest JSON). Czy na pewno chcesz wysłać prośbę JSON? (Nie należy mylić tego z odpowiedzią JSON). Czy chcesz użyć parametru typu kodowania .URL, a nie .JSON?

  4. Zawsze, gdy masz prośbę, która działa poprawnie z poziomu przeglądarki internetowej, ale nie z poziomu aplikacji, warto obejrzeć oba przy użyciu narzędzia takiego jak Charles, a następnie porównać różne metody i zdiagnozować źródło różnych zachowań. .

+0

Tak. Najlepiej, że wyślę właściwą odpowiedź z powrotem, aby potwierdzić, że pakiet został poprawnie przetworzony ... Ale czy nie powinienem zobaczyć komunikatu console.log, który mówi, że otrzymał coś z telefonu? Właśnie próbuję sprawdzić, czy wiadomość, którą wysyłam z telefonu, jest nawet zarejestrowana przez telefon (po tym mogę przeanalizować wiadomość i odesłać poprawną odpowiedź). – andyopayne

+0

Zmieniłem funkcję Alamofire, aby używać '.responseString' zamiast' .responseJSON', a komunikat, który otrzymuję, jest następujący: 'Opcjonalnie (" Can not POST/update \ n ")'.Używałem też Charlesa, kiedy to robiłem i nie widziałem żadnej aktywności wyświetlanej w dzienniku (jednak widziałem rekord, kiedy wszedłem do adresu IP w przeglądarce na moim komputerze). Czy wiesz, co oznacza odpowiedź Alamofire lub dlaczego nie będzie zamieszczać tego adresu? – andyopayne

+1

@andyopayne Być może jest to referencja 'app.get'. Czy nie powinno to być 'app.post', jeśli chcesz obsłużyć żądania' POST' dla '/ update'? – Rob

0

Wygląda na to, że serwer węzła nie jest powiązany z adresem, na który ma być zainstalowany. Powinieneś to sprawdzić, wpisując rzeczywisty adres IP w swojej "http://XXX.XX.X.XX:3000/update" w swojej przeglądarce internetowej, która odpowiada. Twoje szczegóły pytania sugerują, że właśnie korzystałeś z adresu zwrotnego.

+0

Rzeczywiście potwierdziłem, że kiedy wpisuję aktualny adres IPv4 z numerem portu, który rzeczywiście obsługuje odpowiednią stronę. Próbowałem więc zarówno 127.0.0.1:300, jak i mojego adresu IPv4: port i obie metody działają zgodnie z oczekiwaniami. Ponadto próbowałem używać adresu IPv4 z portem z przeglądarki internetowej na innym komputerze (klient i serwer znajdują się na różnych komputerach) i mogę uzyskać serwer sieciowy, aby poprawnie obsłużyć plik index.html. Wygląda więc na to, że ta część działa poprawnie, o ile wiem. – andyopayne

2

Jeśli korzystasz z Express serwera i iOS Simulator na tym samym komputerze, spróbuj użyć http://0.0.0.0:<port>/<url> zamiast rzeczywistego adresu IP, pomógł mi w moim przypadku.