こんにちは、初めて質問を投稿しています。長い時間が他の質問の恩恵を享受しているので、私はここで質問に答えてくれた皆さんに感謝の言葉を述べます。ローカルの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
過去の最初の投稿を確認したことがありますが、これは優れています。 –
しかし、http://stackoverflow.com/q/32936183/5276890の複製でもあります。ご質問の前に、Googleのスタックオーバーフローをお試しください。私は 'NSURLErrorDomain 1004'の検索で5分後にこれを見つけた –
ロイ私は任意の負荷を許可しなければならなかったチュートリアルのAPIを得るために言及することを忘れてしまった。私は私の質問の新しい編集バージョンで私のplistファイルのスクリーンショットを追加しました –