2016-10-22 3 views
2

안녕하세요 모든 질문을 처음 게시합니다. 오랜 시간 동안 다른 질문의 이점을 얻었으니 여기에 질문에 답하는 모든 이들에게 감사의 말을 전하고 싶습니다.iOS api에서 로컬 RESTful Django 호출이 실패합니다.

내 질문에. 그래서 JSON 객체를 브라우저에 제대로 반환하는 로컬 Django 서버를 설정했습니다. 나는 또한 자습서 HTTP 서버에서 제대로 작동하는 swift를 사용하여 IOS에서 스키마를 쿼리하는 API를 설정했습니다. 나는 내 데이터 및 응답 객체가 빈 채로있는 내 자신의 로컬 서버를 호출하려고하지만 경우

내 장고 view.py 및 url.py 파일

from rest_framework import status 
from rest_framework.views import APIView 
from rest_framework.response import Response 
from snippets.models import Snippet 
from django.http import Http404 
from snippets.serializers import SnippetSerializer 

class SnippetList(APIView): 
    """ 
    List all snippets, or create a new snippet. 
    """ 
    def get(self, request, format=None): 
     snippets = Snippet.objects.all() 
     serializer = SnippetSerializer(snippets, many=True) 
     return Response(serializer.data) 

    def post(self, request, format=None): 
     serializer = SnippetSerializer(data=request.data) 
     if serializer.is_valid(): 
      serializer.save() 
      return Response(serializer.data, status=status.HTTP_201_CREATED) 
     return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 

class SnippetDetail(APIView): 
    """ 
    Retrieve, update or delete a snippet instance. 
    """ 
    def get_object(self, pk): 
     try: 
      return Snippet.objects.get(pk=pk) 
     except Snippet.DoesNotExist: 
      raise Http404 

    def get(self, request, pk, format=None): 
     snippet = self.get_object(pk) 
     serializer = SnippetSerializer(snippet) 
     return Response(serializer.data) 

    def put(self, request, pk, format=None): 
     snippet = self.get_object(pk) 
     serializer = SnippetSerializer(snippet, data=request.data) 
     if serializer.is_valid(): 
      serializer.save() 
      return Response(serializer.data) 
     return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 

    def delete(self, request, pk, format=None): 
     snippet = self.get_object(pk) 
     snippet.delete() 
     return Response(status=status.HTTP_204_NO_CONTENT) 

내 아이폰 OS API 파일

import Foundation 
import SwiftyJSON 

typealias ServiceResponse = (JSON, NSError?) -> Void 

class RestApiManager: NSObject { 
    static let sharedInstance = RestApiManager() 

let baseURL = "http://127.0.0.1:8000/snippets/?format=json" 

func getRandomUser(onCompletion: (JSON) -> Void) { 
    let route = baseURL 
    makeHTTPGetRequest(route, onCompletion: { json, err in 
     onCompletion(json as JSON) 
    }) 
} 

func makeHTTPGetRequest(path: String, onCompletion: ServiceResponse) { 
    let request = NSMutableURLRequest(URL: NSURL(string: path)!) 

    let session = NSURLSession.sharedSession() 
     let task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in 
     print(data) 
     print(response) 
     print(error) 
     print("list") 
     let json:JSON = JSON(data: data!) 
     onCompletion(json, error) 
    }) 
    task.resume() 
} 

내 테이블 행을 동적으로 추가하는 컨트롤러보기

import UIKit 
import MapKit 
import CoreLocation 
import SwiftyJSON 

class TableMenu: UIViewController, UITableViewDataSource, UITableViewDelegate { 

    var tableView:UITableView? 
    var items = NSMutableArray() 

    override func viewWillAppear(animated: Bool) { 
    let frame:CGRect = CGRect(x: 0, y: 100, width: self.view.frame.width, height: self.view.frame.height-100) 
    self.tableView = UITableView(frame: frame) 
    self.tableView?.dataSource = self 
    self.tableView?.delegate = self 
    self.view.addSubview(self.tableView!) 

    let btn = UIButton(frame: CGRect(x: 0, y: 25, width: self.view.frame.width, height: 50)) 
    btn.backgroundColor = UIColor.cyanColor() 
    btn.setTitle("Add new Dummy", forState: UIControlState.Normal) 
    btn.addTarget(self, action: #selector(TableMenu.addDummyData), forControlEvents: UIControlEvents.TouchUpInside) 
    self.view.addSubview(btn) 
    } 




func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return self.items.count; 
} 

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    var cell = tableView.dequeueReusableCellWithIdentifier("CELL") as UITableViewCell! 

    if cell == nil { 
     cell = UITableViewCell(style: UITableViewCellStyle.Value1, reuseIdentifier: "CELL") 
    } 

    let user:JSON = JSON(self.items[indexPath.row]) 

    print(user) 
    //let picURL = user["picture"]["medium"].string 
    //print(picURL) 
    //let url = NSURL(string: picURL!) 
    //let data = NSData(contentsOfURL: url!) 
    //print(user) 
    cell!.textLabel?.text = user.string //user["username"].string 
    // cell?.imageView?.image = UIImage(data: data!) 

    return cell! 
} 
func addDummyData() { 
    RestApiManager.sharedInstance.getRandomUser { json in 
     let results = json.array 
     for Json: JSON in results! { 
     let user: AnyObject = Json["id"].string! 
      print(user) 
      self.items.addObject(user) 
      dispatch_async(dispatch_get_main_queue(),{ 
       self.tableView?.reloadData() 
      }) 
     } 
    } 
} 
    /* 
    // MARK: - Navigation 

    // In a storyboard-based application, you will often want to do a little preparation before navigation 
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    // Get the new view controller using segue.destinationViewController. 
    // Pass the selected object to the new view controller. 
    } 
    */ 

} 

오류 개체 f를 인쇄 할 때 오류가 발생합니다. 롬 dataTaskWithRequest 방법 나는이에 대한 답변을 위해 잠시 동안 여기에보고

Optional(Error Domain=NSURLErrorDomain Code=-1004 "Could not connect to the server." UserInfo={NSUnderlyingError=0x12dd99a50 {Error Domain=kCFErrorDomainCFNetwork Code=-1004 "(null)" UserInfo={_kCFStreamErrorCodeKey=61, _kCFStreamErrorDomainKey=1}}, NSErrorFailingURLStringKey=http://127.0.0.1:8000/snippets/?format=json, NSErrorFailingURLKey=http://127.0.0.1:8000/snippets/?format=json, _kCFStreamErrorDomainKey=1, _kCFStreamErrorCodeKey=61, NSLocalizedDescription=Could not connect to the server.}) 

얻을 수 있지만, 모든 것을위한 인증에 대해 내가 내가 액세스위한 인증을 필요로 특정 데이터베이스 사용자를 제공하기 전에 통신이 둘을 얻어서 ID의 시작을 생각

감사합니다.

미래의 질문을 적극적으로 받기 위해 제 스택 오버플로 에티켓을 비평하십시오. 앱 운송 보안의 일환으로, 애플은 iOS 앱에서 모든 보안되지 않은 HTTP 트래픽을 사용할 수있다 info.plist

+0

과거에 처음으로 게시물을 검토 한 사람으로 말하면이 사람은 우수합니다. –

+0

그러나 http://stackoverflow.com/q/32936183/5276890의 사본이기도합니다. 요청하기 전에 Google 스택 오버플로를하시기 바랍니다. 나는 'NSURLErrorDomain 1004'에 대한 검색과 함께 5 분 후에 이것을 발견했다. –

+0

Roy 자습서를 얻으려는 것을 잊어 버렸고, API를 작동 시키려면 임의의 하중을 허용해야했다. 내 질문의 새 편집 된 버전에 내 plist 파일의 스크린 샷을 추가했습니다. –

답변

0

를 다음과 같이 내의 Info.plist 보이는

건배 너희들

편집. 이는 보안 모범 사례를 시행하는 데 도움이됩니다.

(NSURLSession 또는 AFNetworking과 같은 라이브러리를 사용하여) ATS를 사용하도록 HTTP 요청을 만들려고하면 오류가 발생합니다.

솔루션 : -

열기의 Info.plist 및 추가 다음 줄 :

<key>NSAppTransportSecurity</key> 
<dict> 
    <key>NSAllowsArbitraryLoads</key> 
    <true/> 
</dict> 

주의 : - 위의 해결책이 될 것을 명심하시기 바랍니다

당신의 최후의 조치. 당신은 이상적 서비스, 또는 다음, 화이트리스트 도메인에 HTTPS를 사용하도록 설정할 것 어떤에 당신이 원하는 HTTP이 모두 사용할 수없는 경우, 다음 자세한 내용은이 링크이 방법

참조 사용 http://www.neglectedpotential.com/2015/06/working-with-apples-application-transport-security/

+0

나는 이미이 일을했다고 언급 했어. –

0

Gy는 컴퓨터 IP 주소를 사용해야한다고 지적했습니다. 로컬 서버에 대해 읽은 후에 내 맥에서 장고 서버를 실행할 때 내 iPad에서 액세스 할 수 없다는 것을 알았습니다.

따라서 내가 작동하도록하려면 동일한 네트워크에 있고 IP 주소를 URL에 넣음으로써 ipad를 내 Mac에 연결해야합니다.

나는 지금까지 프런트 엔드 개발에 집중할 필요가 있었지만,이 링크를 실행하는 모든 여행자는이 링크가 도움이 될 것입니다.

Access localhost on Mac from XCode? Phonegap communicating with Ajax to a local Rails app

나는 희망이 미래에 작업을 진행하고이 대답을 업데이트합니다.

건배

관련 문제