2015-02-05 2 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) 
}) 

그래서,이 서버는 확인을 작동하는 것 같다. 브라우저에서 테스트하고 URL : http://127.0.0.1:3000을 입력하면 index.html 파일이 나에게 전송됩니다. 내가 http://127.0.0.1:3000/update을 입력하면 ... "전화에서 뭔가를 얻었습니다!" 메시지. 그러나, 내 애플 리케이션을 실행 (내 전화가 서버와 동일한 무선 네트워크에 있는지 확인) Alamofire 메서드가 호출되면 ... 내가받는 응답은 0입니다. 나는 또한 "전화에서 뭔가를 얻었습니다!" 메시지. 아무도 내가 왜 그런 일이 일어날 지 알려주지 않겠습니까? 아니면 더 나은 방법, 그것을 고치는 방법을 알려주십시오.

답변

5

몇 가지 생각 :

  1. 당신은 Alamofire에서 POST 요청을 만드는,하지만 당신은 /update에 대한 GET 요청을 처리하기 위해 Express를 말 했어요. POST으로 처리하려면 app.post(...)을 사용하십시오.

  2. Alamofire 코드가 JSON 응답을 찾고 있지만 사용자가 JSON 응답을 생성하지 않는 것 같습니다. 단기적으로는 responseJSON 대신 responseString을 사용할 수 있습니다.하지만 JSON으로 응답하도록 웹 서비스를 변경하려고합니다 (앱이 응답을 더 쉽게 파싱 할 수 있도록하기 위해).

  3. Alamofire 코드가 JSON 요청을 보내고 있지만 (웹 브라우저를 통해 요청을 보내면 분명히 JSON이 아닙니다.) JSON 요청을 보내시겠습니까? JSON 응답 문제와 혼동해서는 안됩니다. .JSON이 아닌 .URL 인코딩 유형 매개 변수를 사용하겠습니까?

  4. 웹 브라우저에서는 제대로 작동하지만 앱에서는 제대로 작동하지 않는 요청이있을 때마다 Charles과 같은 도구를 사용하여 두 가지를 모두 관찰하면 차이점을 비교하고 다른 행동의 원인을 진단 할 수 있습니다. .

+0

예. 이상적으로, 패키지가 제대로 처리되었다는 것을 알리기 위해 적절한 응답을 보내 드리겠습니다 ... 그러나 console.log 메시지에 전화기에서 무엇인가를 받았다고해서는 안됩니까? 지금 당장은 전화로 보낸 메시지가 전화로 등록되었는지 여부를 확인하려고합니다. (메시지를 파싱하고 적절한 응답을 보낼 수 있습니다.) – andyopayne

+0

Alamofire 함수를'.responseJSON' 대신'.responseString'을 사용하도록 변경했고, 돌아 오는 메시지는 다음과 같습니다 :'Optional ("POST/update \ n")'.또한이 작업을 수행 할 때 Charles도 사용하고 있었고 로그에 아무런 활동도 표시되지 않았습니다 (컴퓨터의 웹 서버에 IP 주소를 입력했을 때 기록을 보았습니다). Alamofire의 응답이 의미하는 바가 무엇이며, 왜 그 주소에 게시되지 않는지 아십니까? – andyopayne

+1

@andyopayne 아마도 'app.get' 참조입니다. '/ update'에 대한'POST' 요청을 처리하고 싶다면'app.post'가 될까요? – Rob

0

노드 서버가 예상 한 주소에 연결되어 있지 않은 것처럼 들립니다. 웹 브라우저의 "http://XXX.XX.X.XX:3000/update"에 실제 IP 주소를 입력하면 응답하는지 확인해야합니다. 질문 세부 정보는 방금 루프백 주소를 사용했음을 나타냅니다.

+0

실제로 포트 번호를 사용하여 실제 IPv4 주소를 입력 할 때 실제로 적절한 페이지를 제공한다는 것을 확인했습니다. 그래서, 나는 127.0.0.1:300과 IPv4 주소 : 포트 모두를 시도했으며 두 방법 모두 예상대로 작동합니다. 또한 다른 컴퓨터의 웹 브라우저에서 포트로 IPv4 주소를 사용해 보았습니다 (클라이언트와 서버가 서로 다른 컴퓨터에 있음). index.html을 제대로 처리 할 수 ​​있도록 웹 서버를 가져올 수 있습니다. 그래서, 제가 말할 수있는 한이 부분이 제대로 작동하고있는 것으로 보입니다. – andyopayne

2

동일한 컴퓨터에서 Express 서버와 iOS 시뮬레이터를 실행하는 경우 실제 IP 대신 http://0.0.0.0:<port>/<url>을 사용해보십시오. 제 경우에는 도움이되었습니다.

관련 문제