Извлечение веб-строки в Swift

#swift #nsurlconnection #swift3

#swift #nsurlconnection #swift3

Вопрос:

Мне трудно извлекать данные при отправке в мою веб-службу с помощью Swift. Все, что я получаю, это количество возвращаемых символов, а не фактические символы. Я полагаю, что они должны быть там, я просто не знаю, как их получить.

Вот мой код Swift 3:

     let url: NSURL = NSURL(string: "http://www.nanorig.dk/api/login")!
    let request:NSMutableURLRequest = NSMutableURLRequest(url:url as URL)

    let bodyData = "data=something"
    request.httpMethod = "POST"

    request.httpBody = bodyData.data(using: String.Encoding.utf8);
    NSURLConnection.sendAsynchronousRequest(request as URLRequest, queue: OperationQueue.main)
    {
        (response, data, error) in
        print("response: (response)")
        print("data: (data)")
        print("error: (error)")
    }
  

Когда я запускаю этот код, я получаю следующий вывод:

 response: Optional(<NSHTTPURLResponse: 0x174225400> { URL: http://www.nanorig.dk/api/login } { status code: 200, headers {
"Accept-Ranges" = bytes;
Age = 0;
"Cache-Control" = "no-store, no-cache, must-revalidate, post-check=0, pre-check=0";
Connection = "keep-alive";
"Content-Encoding" = gzip;
"Content-Length" = 85;
"Content-Type" = "text/html; charset=UTF-8";
Date = "Thu, 06 Oct 2016 13:15:18 GMT";
Expires = "Thu, 19 Nov 1981 08:52:00 GMT";
Pragma = "no-cache";
Server = Apache;
"Set-Cookie" = "PHPSESSID=6so30t6brvj6j5k03kihr1m1f5; path=/";
Vary = "Accept-Encoding";
Via = "1.1 varnish-v4";
"X-Powered-By" = "PHP/5.6.26";
"X-Varnish" = 159701416;
} })
data: Optional(45 bytes)
error: nil
2016-10-06 15:15:19.428231 NanOrig[2245:1192962] [MC] System group container for systemgroup.com.apple.configurationprofiles path is /private/var/containers/Shared/SystemGroup/systemgroup.com.apple.configurationprofiles
2016-10-06 15:15:19.436932 NanOrig[2245:1192962] [MC] Reading from public effective user settings.
  

Обратите внимание, в частности, на следующую строку в приведенном выше:

 data: Optional(45 bytes)
  

Метод, выполняемый на сервере, представляет собой простую строку PHP:

 echo 'just a test string to return to the swift app';
  

… это 45 символов…

Итак, как я это вижу, переменная «data» должна каким-то образом содержать то, что отражается; как еще он должен знать количество символов? Я просто не знаю, как их извлечь, и я перепробовал все, что мог придумать (помещая вызов метода в переменную, присваивая значение данных чему-то другому, преобразуя его в строку, искал метод toString, гуглил и искал здесь похожие проблемы, даже пробовалсовершенно другой фрагмент кода из Интернета, что привело к той же проблеме).

У меня есть код в другом месте моего приложения, который возвращает строку с сервера с помощью простых запросов GET, однако это должно быть СООБЩЕНИЕ — я просто пока ничего не публикую, поскольку, похоже, это не работает.

Я действительно надеюсь, что кто-нибудь может сказать мне, что происходит.

Ответ №1:

Вы должны иметь возможность легко использовать эти данные NSString NSString(data: data, encoding: NSUTF8StringEncoding) .

Чтобы развернуть результирующую строку (поскольку это неудачный инициализатор), выполните следующие действия:

 if let unwrappedDataString = dataString {
    // Do things with the unwrapped string.
}
  

Редактировать:

Чтобы идеально написать это для вас, используйте следующее. В вашем комментарии вы принудительно развернули данные, что означает, что если по какой-либо причине данные не существуют, ваше приложение выйдет из строя.

 if let unwrappedData = data {
   if let dataString = NSString(data: unwrappedData, encoding: String.encoding.utf8.rawValue) {
          // Do stuff
  }
}
  

Комментарии:

1. Это отлично работает после рефакторинга до этого: NSString(данные: данные!, кодировка: строка. Encoding.utf8.rawValue); Он по-прежнему возвращается как необязательный (фактическая строка) — вы знаете, почему это так / как избавиться от этого? Я приму ваш ответ через 5 минут, когда мне будет разрешено 😊

2. Я изменил свой ответ, чтобы отразить это. 😉

3. Это просто ПРЕКРАСНО! — Большое вам спасибо, мистер Кинг. И это всегда приятно с бесплатным исправлением ошибок 😄

4. Рад, что смог помочь!