2016-10-22 9 views
2

こんにちは、初めて質問を投稿しています。長い時間が他の質問の恩恵を享受しているので、私はここで質問に答えてくれた皆さんに感謝の言葉を述べます。ローカルのRESTful DjangoへのiOS APIの呼び出しに失敗する

私の質問に。だから私はブラウザにJSONオブジェクトを適切に返すローカルのDjangoサーバを設定しました。また、チュートリアルHTTPサーバーで適切に動作するswiftを使用して、IOSでAPIクエリスキームを設定しました。しかし、私は自分のローカルサーバ自分のデータと応答オブジェクトを呼び出そうnillある

私のDjangoの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) 

私のiOS 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を印刷するとエラーが発生しますROMの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.}) 

得るが、すべてが真偽についてですと私はアクセスに真偽を必要とする特定のデータベースのユーザーを与える前に、2つの通信を取得することにより、IDの開始を考え出し

お時間をいただきありがとうございます。

今後の質問が積極的に受けられるように、私のスタックオーバーフローエチケットを批判してください。 info.plist

+0

過去の最初の投稿を確認したことがありますが、これは優れています。 –

+0

しかし、http://stackoverflow.com/q/32936183/5276890の複製でもあります。ご質問の前に、Googleのスタックオーバーフローをお試しください。私は 'NSURLErrorDomain 1004'の検索で5分後にこれを見つけた –

+0

ロイ私は任意の負荷を許可しなければならなかったチュートリアルのAPIを得るために言及することを忘れてしまった。私は私の質問の新しい編集バージョンで私のplistファイルのスクリーンショットを追加しました –

答えて

0

を次のように私のInfo.plistに見える

乾杯のy'all

編集Apple社のAppは交通安全の一環として、iOSアプリからのすべてのセキュリティで保護されていないHTTPトラフィックを無効にしています。これにより、セキュリティのベストプラクティスが強化されます。

ATSを有効にして(NSURLSessionやAFNetworkingなどのライブラリを使用して)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からアクセスすることはできません私のMac上でdjangoサーバーを実行したときに私はそれを発見した。

私はそれを働かせるために、私は同じネットワーク上にあり、IPアドレスをURLに入れて、私のMacにipadをリンクする必要があります。

私はそれを稼働させましたが、現時点ではフロントエンドの開発に焦点を当てる必要がありますが、このリンクを実行する旅行者にとって、このリンクは役立ちます。

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

私はうまくいけば、それが将来的に取り組んで取得し、この答えを更新します。

乾杯

関連する問題