Hoşgeldin. Soru sormak veya cevaplamak için hemen üye ol.
0 oy
2.7k kez görüntülendi
ios development kategorisinde tarafından
tarafından yeniden açıldı
Merhabalar,

Kullanıcı girişi yapan bir web servisim mevcut string olarak username ve password alıyor . Geri dönüş değeri boolean tipinde true false olarak bunu ios swiftte nasıl alabilirim true dönmesi gerekirken sürekli false olarak alıyor.

Kodlar bu şekilde : XML de userName ve Password gönderirken mi hata yapıyorum ??

    @IBOutlet weak var txtUserName : UITextField!
    @IBOutlet weak var txtPassword : UITextField!
    var mutableData:NSMutableData = NSMutableData.init()
    var currentElementName:NSString = ""

    @IBAction func actionLogin(sender : AnyObject) {

          guard let userName = txtUserName.text,let password=txtPassword.text where userName != "" && password !=""                                                else {    return    }

        let soapMessage = "<?xml version='1.0' encoding='utf-8'?><soap:Envelope xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'><soap:Body><Login xmlns='http://tempuri.org/'><Login><UserName>'\(userName)'</UserName><Password>'\(password)'</Password></Login></Login></soap:Body></soap:Envelope>"

        let urlString = "web service url si"
        let url = NSURL(string: urlString)
        let theRequest = NSMutableURLRequest(URL: url!)
        theRequest.addValue("text/xml; charset=utf-8″", forHTTPHeaderField: "Content-Type")
        theRequest.addValue("/(soapMessage.characters.count)", forHTTPHeaderField: "Content-Length")
        theRequest.HTTPMethod = "POST"
        theRequest.HTTPBody = soapMessage.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false) // or false
        let connection = NSURLConnection(request: theRequest, delegate: self, startImmediately: true)
        connection!.start()

    }
    // NSURLConnectionDelegate
    // NSURL
    func connection(connection: NSURLConnection!, didReceiveResponse response: NSURLResponse!) {
        mutableData.length = 0;
    }

    func connection(connection: NSURLConnection!, didReceiveData data: NSData!) {
        mutableData.appendData(data)
    }
     func connectionDidFinishLoading(connection: NSURLConnection!) {
        let xmlParser = NSXMLParser(data: mutableData)
        xmlParser.delegate = self
        xmlParser.parse()
        xmlParser.shouldResolveExternalEntities = true
    }

    // NSXMLParserDelegate
    func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
        currentElementName = elementName
    }

    func parser(parser: NSXMLParser,foundCharacters string: String) {
          NSLog("Return : \n", string)
    }
}

2 Cevaplar

+2 oy
tarafından
tarafından düzenlendi

Çalıştığınız xml den, dönen iki adet itemi, bilgilerini değiştirerek paylaşırsanız, çok daha iyi yardımcı olabiliriz.

Ayrıca hatırlatma fayda var, http isteğinin başarılı bir şekilde tamamlandığından emin misiniz, parse etden önce breakpoint koyup gelen değeri kontrol ettiniz mi ?

İyi çalışmalar.

Dip Not: Allah rızası için herkez JSON kullansın, katletsinler artık şu XML i .

tarafından
dönen iki adet item derken neyi kastetdiniz anlamadım dönen sadece true yada false xml e gönderilenlerde kullanıcı adı ve şifre
tarafından
Evet, sanırım orayı yanlış anlamışım. Parse işlemlerini görünce bir sonuç okunuğını, bir kaç itemi bulunan bir xml okumaya çalıştığınızı düşünmüştüm.

Xml ile gönderilen, bilgileriniz onlar (user,pass) fakat işlemin sonucunu ne şekilde alındığına ait, bir örnek verebilir misiniz ?

Sadece true yada false gelceğini sanmıyorum, muhtemelen login olan kullanıya ait bir kaç bilgi geri döncektir.

Yanlış anlamıyorsam eğer, aldığınız sonucun ne olduğuna dair biraz daha bilgi verebilir misiniz ?
tarafından
Sadece true yada false o kişinin yetkisi var yada yok şeklinde bir kontrol
Geri dönüş XML şu şekilde :

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <LoginResponse xmlns="http://tempuri.org/">
      <LoginResult>boolean</LoginResult>
    </LoginResponse>
  </soap:Body>
</soap:Envelope>

boolean değeri nasıl parse edeceğimi anlamadım bu kodlar CelsiusToFahrenheit örneğinde çalışıyor fakat buraya uyarlayamadım.
<Login><UserName>'\(userName)'</UserName>  burada göderirken " " içerisinde mi olmalı kullanıcı adı String tipinde olması için
tarafından
userName'in senin giriş yapan kullanıcı adın yani global bir değişken bu yüzden sen bir değişken tanımlayıp örn:   "<Login><UserName>"+degisken+"</UserName>" bu şekilde string olarak tanımladığın xml içine parametre olarak koyacaksın kullanıcı giriş yaptığında bu parametler dolacak karşı taraftanda cevap true yada false olarak dönecek işlem basit xml'ini biliyor olsak halledilir. Ben ufak bi proje hazırlayıp birazdan atayım.
tarafından
tarafından düzenlendi
+1
Evet, paylaştığın örenkte görüldüğü şekilde, bize bir xml dönüyor ve bizde bunu parse ediyoruz.

Öncelikle aşağıdaki örneği incelemeni öneririm.
http://webindream.com/soap-with-swift/

Response tek bir element, ve foundCharacters methodunda daha önce currentElementName değişkenine parse edip atmıştın.  OK.
Bu yuzden bu method içinde, işlemini yaperken aşağıdaki şekilde işlem yapmalısın, bu şekilde denedin mi ?

Daha sonra string olarak aldığın veriyi istediğin ve türüne çevirirsin.
       Burada print(currentElementName) dediğinde gelen sonucu kontrol ettiğinde xml i alabilmiş oluyormusun ?

        if currentElementName == "LoginResult" {
            print(string)
        }

edit : ibolat arkadaşımın dediği şekilde, user name i doğru konderidğinizden emin olun yoksa hep false sonucu alrısınız.
tarafından
sizin attığınız http://webindream.com/soap-with-swift/   adresinden aldım kaynağım orası sıcaklık için çalışıyor evet kendi istediğim şekilde uyarladığımda çalıştıramadım
tarafından
çalışan bir örnek hazırlamamız için, burda yada özelden istek urlnizi paylaşırsanız hızlıca çözüm sağlayabiliriz.
tarafından
https://www.dropbox.com/s/mer3k2n7hxbbr2x/Screen%20Shot%202016-06-29%20at%2013.47.39.png?dl=0

 linkinden web service görüntüsüne erişim sağlayabilirsiniz. Url versemde çalışmayacaktır dışarıya kapalı şirket ağında çalışan bir web service
tarafından
http://swiftstub.com/212706870

Yukarıdaki örneği kendinize uyarlayıp, print loglarının ekran görüntüsünü paylaşırmısınız.
tarafından
Attığınız örnekle celcius bilgisini nerede web servise gönderiyor
tarafından
Ben bu örnekte göndermedim, ama göndermiş olsaydım soap mesage içindeki ilgili tag arasında olacaktır, siz kendi örneğinizde olduğu şekilde burdaki  soap message kısmını güncelleyin, yalnız user ve pass değişkenlerinizi tanımlamayı unutmayın.

Size lazım olan input elemanlarını tanımlayıp, soap messageınızı gönderdikğinizde bir hata yoksa doğru sonuç alacaksınız. Yada nerde hata veriyor print loglarında göreceğiz.

Hatta soap mesage değikeninin altında da giden message yazdırın onada baklım bir sorun olacak mı.
tarafından
tarafından düzenlendi
+1
https://www.dropbox.com/s/653ico8yxznv41y/IOSWebService.png?dl=0
linkinde bakabilirsiniz.

edit :  Web service kullanıcı giriş denemelerindeki hatalara baktım kullanıcı adı olarak ''Optional("asdf")'' gibi alıyor Optional ifadesinin gitmemesi lazım sadece "asdf" şeklinde almalı kullanıcı adını  o neden geliyor nasıl kaldırabilirim ??
tarafından
tarafından düzenlendi
Sayfayı yenilemediğimden görmemişim arkadaşım aşağıda açıklamış, ayrıca guard da kulanabilirsiniz.
0 oy
tarafından
tarafından seçilmiş
 
En İyi Cevap

Ek'teki projede ufak bir örnek var kendinize göre derleyip çalıştırırsanız sonuca ulaşacağınızı umuyorum.

tarafından
yok sizin attığınız kaynak kod için teşekkür ederim fakat onda da aynı sonucu alıyorum false o zaman sanırım xml hata var.

https://www.dropbox.com/s/mer3k2n7hxbbr2x/Screen%20Shot%202016-06-29%20at%2013.47.39.png?dl=0

linkinde web service ekran görüntüsü vardır. Buna göre benim yazdığım xml hatam nerede??
tarafından
web servise gönderdiğiniz herhangi kullanıcı adı ve şifre parametreleri her zaman true mi dönderiyor.
tarafından
hayır her zaman false olarak geri dönüyor
tarafından
Hayır ondan bahsetmiyorum bu web servisi kim yazdıysa kontrolü neye göre yapıyor her kullanıcı adı ve şifre geldiğinde false mu gönderiyor true mi şimdi hepsinde false gönderiyorsa belki senin programın çalışıyor ama servisten true cevabı almaya çalışıyorsun.
tarafından
yok hayır kullanıcı tanımlı yada tanımsız şeklinde çalışıyor, kullanıcı adı ve şifre doğruysa true yanlışsa false zaten test ettim web service true döndürmesi gereken kullanıcı adı ve şifreyi kullanıyorum
tarafından
soapUI kullanarak xml'i test ettiniz mi?
tarafından
https://www.dropbox.com/s/653ico8yxznv41y/IOSWebService.png?dl=0
linkinde bakabilir misiniz soapMessage , Response ve geri dönüş değerini print ettim
Web service kullanıcı giriş denemelerindeki hatalarada baktım kullanıcı adı olarak ''Optional("asdf")'' gibi alıyor Optional ifadesinin gitmemesi lazım sadece "asdf" şeklinde almalı kullanıcı adını  o neden geliyor nasıl kaldırabilirim ??
tarafından
evet optional olmaması lazım. şimdi oraya gelen değerleri nasıl alıyorsun ona bakmak lazım, tavsiyem 2 adet global değişken tanımla  var userName:String = ""   var password:String = ""  gibi daha sonra kullanıcı textfield ları doldurduktan sonra bu değişkenlere textfield'lardan gelen değerleri ata,
 örn: txtfieldUsername.text = userName
daha sonra bu global değişkenleri web servis xml içinde gerekli alana ekle  ......" + userName + "....... daha sonra olacaktır.
tarafından
ibrahim bey çok teşekkür ederim hatam
var userName:String = ""
var password:String = "" değişkenleri let olarak tanımlamakmış şimdi düzgün bir login işlemi şeklinde çalışıyor sonunda true ifadesini görebildim.

İlgilenen tüm arkadaşlara teşekkür ederim..
tarafından
Rica ederiz. Soruyu da cevaplandı seçerek kapatırsanız :)
...