Şu an django kullanılmış bir web uygulamamız var. Bütün projeyi baştan kodlamak çok uzun süreceği için aynı backend'e sahip native bir iOS uygulaması yazmak istiyoruz. Benim internetten araştırdığım kadarıyla 2 farklı çözümü var bunun:

1) İhtiyacımız olan methodları çağıran Django URL'lerini çağırmak ve bu methodların içinde HTTP Response/Request ile gelen JSON'ı kullanmak

2) Django sunucusundan Tastypie gibi birşey ile bir REST servisi oluşturmak. Fakat bu seçenek şirket içerisinde bir nedenden dolayı onaylanmadı.

  1. seçeneğe dair ise internette pek birşey bulamadım. Daha önce böyle birşey gören, bilen, duyan var mıdır?

Örnek python methodum (views.py dosyasından):

def get_rss_data_ios(request):
    user_id = int(request.POST['user_id'])
    user = User.objects.get(id=user_id)

    store_user_activity(user, 'RSS')
    context = {'user_rss_data' : []}
    from_basket = int(request.POST['from_basket'])

    if 'start_day' not in request.POST or int(request.POST['start_day']) == -1:
        start_day = 1
        start_mon = 1
        start_year = 1000
        end_day = 31
        end_mon = 12
        end_year = 3000
        context['timefilter'] = False
    else:
        start_day = int(request.POST['start_day'])
        start_mon = int(request.POST['start_mon'])
        start_year = int(request.POST['start_year'])
        end_day = int(request.POST['end_day'])
        end_mon = int(request.POST['end_mon'])
        end_year = int(request.POST['end_year'])
        context['timefilter'] = True

    search_text = None
    if request.method == 'POST':
        f = GenericForm(request.POST)
        if f.is_valid():
            search_text = f.cleaned_data['generic']
        else:
            print f.errors

    dr = [str(start_year)+"-"+str(start_mon)+"-"+str(start_day) + 'T0:00+00:00',
          str(end_year)+"-"+str(end_mon)+"-"+str(end_day) + 'T23:59+00:00']

    if from_basket:
        user_rss_sc = SearchCriteria.objects.filter(sc_type = 'rss').order_by('-id')
    else:
        user_rss_sc = SearchCriteria.objects.filter(sc_type = 'rss').filter( id__in = Subscription.objects.filter( user = user).values_list('search_criteria')).order_by('-id')

    context['from_basket'] = from_basket

    for urs in user_rss_sc:
        added_title = False
        if search_text is not None and len(search_text) > 2:
            search_qs = reduce( operator.or_, (Q(title__icontains = x) for x in search_text.split(',')))
            search_qs = search_qs | reduce( operator.or_, (Q(description__icontains = x) for x in search_text.split(',')))

            for s_res in SearchResult.objects.filter( searchcriteria = urs ).filter(search_qs).filter(date_added__range=dr).order_by('-id')[:5]:
        like = Like.objects.filter(user = user, search_result = s_res)
                if like is None or len(like) == 0:
                    like = False

                if not added_title:
                    context['user_rss_data'].append(('title', urs.description))
                    added_title = True
                context['user_rss_data'].append( ('data', s_res, SearchCriteria.objects.filter(search_result = SearchResult.objects.get(id=s_res.id)), like, Like.objects.filter(search_result = s_res).distinct\\
().count() ) )
        else:
            for s_res in SearchResult.objects.filter( searchcriteria = urs ).filter(date_added__range=dr).order_by('-id')[:5]:
                like = Like.objects.filter(user = user, search_result = s_res)
                if like is None or len(like) == 0:
                    like = False

                if not added_title:
                    context['user_rss_data'].append(('title', urs.description))
                    added_title = True
                context['user_rss_data'].append( ('data', s_res, SearchCriteria.objects.filter(search_result = SearchResult.objects.get(id=s_res.id)), like, Like.objects.filter(search_result = s_res).distinct\\
().count() ) )

    return HttpResponse(json.dumps(context['user_rss_data']))

soruldu: 07 Nis '14, 09:26

Timur%20Aykut%20YILDIRIM's gravatar image

Timur Aykut YILDIRIM
371325047
cevap kabul oranı: 14%

değiştirildi: 08 Nis '14, 13:14


Merhaba,

Benim anlamadığım json servislerini sunan servisiniz bir şekilde zaten kabaca bir rest servisi olmuş oluyor yani ortada 2 farklı çözüm yok.

Tercihen xml ile de datanızı sunabilirsiniz. Fakat ben yaptığım projelerde daha hafifsiklet olduğu için json kullanıyorum..

IOS'ta native olarak json serializer altyapısı mevcut:

https://developer.apple.com/library/ios/documentation/foundation/reference/nsjsonserialization_class/Reference/Reference.html

Ayrıca Network Requestler için de ios'un native network framework'ünü derleyip toparlamış olan "AFNetworking 2" yi tavsiye edrim

Bu konuda araştırdığınızda çok fazla tutorial bulabilirsiniz. Yalnız burada öğrenmeniz gereken json serialization dan ziyate uikit'i öğrenmek sanırım.

Ek: Örnek kod. Burada hiç networking ile ilgili bir framework kullanmadan doğrudan datayı alıyorum. Ayrıca bu kod senkron bir koddur, çok büyük bir ihtimalle kullanıcı arayüzünnü donmaması için bu kodu ayrı bir thread'e veya farklı bir dispatch içerisinde çalıştırman gerekir... Kodu aklımdan yazdığımdan yazım hataları olabilir..

Objective-C 'de genel json nesneleri bir array olarak alınır. Bu arrayn herbir elemanı "NSDictionary" nesnesidir. aşağıdaki gibi bu arrayi sıradan ilerleyerek içeriklerine ulaşabilirsin..

Önemli bir not daha, gönderdiğin json nesnesi bir array değilse, doğrudan NSDictionary olarak json nesnesini alabilirsin..

NSURL* url = [NSURL urlWithStrig:@"www.api.adresi.com/jsonservisi"];
NSData* data = [NSData dataWithContentsOfURL:url];
NSError* error;
NSArray *jsonArray = [NSJSONSerialization JSONObjectWithData: data options: NSJSONReadingMutableContainers error: &error];
for(NSDictionary* jsonDictionary in jsonArray){
    NSString* value = [jsonDictionary objectForKey:@"parametre"];
    NSLog(@"gelen cevap: %@",value);
}
permanent link

cevaplandı: 07 Nis '14, 14:20

dreampowder's gravatar image

dreampowder
3.3k112849
cevap kabul oranı: 23%

değiştirildi: 10 Nis '14, 09:39

2

Cevaba ek olarak: Mantikli olan Django projesinde Restful Web Servisleri bir API yazmaniz. Boylece Web Client ve Mobil App ayni codebase'de ama farkli yapi ile calisir. Mobil App'nin API ile Web Client'dan ayri yazilmasi ikisinde de birbirinden bagimsiz degisikliklerin kolay sekilde yazilabilmesini saglar.

Ayrica Mobil App icin tamamen farkli ikinci bir API projesi yazmak isterseniz Flask (http://flask.pocoo.org/) veya Pyramid (www.pylonsproject.org/) ile cok hizli Restful Web Servisleri yazabilirsiniz. Böylece Mobil App icin http://api.webprojem.com gibi Restful Url kullanabilirsiniz.

(07 Nis '14, 18:26) CemIkta ♦ CemIkta's gravatar image

Serdar hocam yukarıya örnek bir method yazdım. Benim anladığım kadarıyla http://xx.xx.xxx.xx:yy/get_rss_data_ios adresinden bu method ulaşabilmem lazım. Ve bu method şu an bu adres üzerinden bir şekilde rest servisi gibi mi davranıyor?

Eğer doğru anladıysam linkten ziyade inceleyebileceğim bir tutorial, kod vs. önerebilir misiniz?

(08 Nis '14, 13:26) Timur Aykut YILDIRIM Timur%20Aykut%20YILDIRIM's gravatar image

Hocam php'den pek anlamam :) Fakat sizin tam olarak rest servisinin ne olduğu konusunda çok bilginiz olmadığını görüyorum.. Cevabıma örnek bir kod ekledim. Daha fazlası için internette binlerce tutorial bulabilirsiniz..

(09 Nis '14, 03:51) dreampowder dreampowder's gravatar image

cevabı düzelttim..

(10 Nis '14, 09:40) dreampowder dreampowder's gravatar image

yardımlarınız için çok teşekkür ederim hocam :)

(11 Nis '14, 14:10) Timur Aykut YILDIRIM Timur%20Aykut%20YILDIRIM's gravatar image
Cevabınız
toggle preview

Bu soruyu takip et

E-Posta üzerinden:

Üyelik girişi yaptıktan sonra abonelik işlemlerini yapabilirsiniz

RSS üzerinden:

Cevaplar

Cevaplar ve Yorumlar

Yazı Formatlama

  • *italic* ya da _italic_
  • **bold** ya da __bold__
  • link:[text](http://url.com/ "başlık")
  • resim?![alt text](/path/img.jpg "başlık")
  • liste: 1. Foo 2. Bar
  • temel HTML etiketleri de kullanılabilir

Bu sorunun etiketleri:

×45
×41
×7
×6

Soruldu: 07 Nis '14, 09:26

Görüntüleme: 2,687 kez

Son güncelleme: 11 Nis '14, 14:10

powered by BitNami OSQA