2014-10-25 3 views
0

Прошу прощения, я не нашел ответа на свой вопрос ((Пожалуйста, не слишком суровый, я не профессиональный программист, но я продолжаю учиться и надеяться, может ответить на чей-то вопрос))Получить HTTP-статус с помощью swift

Я пытаюсь получить HTTP-статус ссылки (я как бы генерирую ссылки в зависимости от одного кода записей базы данных, например ABCDEF, я храню их в массиве, а затем создаю ссылку на вторая база данных, например, www.blablabla.ABCDEF.net), поэтому я вижу, существует ли страница в базе данных или нет.

Я написал этот код, но что-то не так. Так что, может быть, это вопрос вроде: «Что случилось с моим кодом?» Но в стеке они также говорят, что вы должны показать свои попытки решения проблем ...

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

Глядя вперед, чтобы помочь и ответы))

var err: NSError! 

NSURLConnection.sendAsynchronousRequest(request, queue: queue, completionHandler:{ (response: NSURLResponse?, data: NSData!, error: err) -> Void in 

    if (err != nil) { 
     let httpStatus: NSHTTPURLResponse = response as NSHHTPURLResponse 
     for myLink in allLinks { 
      println("HERE IS THE CURRENT STATUS CODE" + httpStatus.statusCode + "OF A LINK:" + myLink) 
      if httpStatus.statusCode == 200 {println("SUCCESS!!!!!")} 
     } 
    } 
} 

ответ

2

Основная проблема здесь в том, что вы, кажется, глядя на statusCode только если err не nil. Но если у вас есть ошибка, у вас, вероятно, нет кода состояния. Параметр ошибки для закрытия указывает на фундаментальную проблему с сетью, которая, вероятно, помешала вам перейти на рассматриваемую страницу. statusCode, как правило, имеет смысл только в том случае, если ошибка былаnil (т. Е. Вам удалось подключиться к серверу), и в этом случае statusCode - это то, как сервер информирует вас о своей способности обслуживать HTTP-запрос.

Несколько незначительных вещей:

  1. Вам не нужно var err: NSError! линии (так как объект error передается в качестве параметра закрытия). Эта переменная, которую вы указали, здесь не используется.

  2. Я не вижу, как error: err, поскольку третий параметр закрытия мог бы сработать. Синтаксис «variableName: variableType», но нет типа err.

  3. Аналогичным образом, ваш код относится к несуществующему классу, NSHHTPURLResponse. В Swift 3 и позже это HTTPURLResponse.

  4. Возможно, необходимо сделать if let для извлечения HTTPURLResponse, чтобы получить statusCode.

  5. Непонятно, что вы намерены выполнять итерацию через allLinks, потому что это соединение предназначено только для заданного request, а не связки ссылок. Просто посмотрите на statusCode в свете конкретных request. Если вам нужно протестировать несколько URL-адресов, вы делаете отдельный request для каждого.

  6. Мы должны рассмотреть любые коды от 200 до 299 как успех, а не только 200. Я бы предложил использовать диапазон 200 ..< 300.

Таким образом:

let task = URLSession.shared.dataTask(with: request) { data, response, error in 
    guard let data = data, let httpResponse = response as? HTTPURLResponse, error == nil else { 
     print("No valid response") 
     return 
    } 

    guard 200 ..< 300 ~= httpResponse.statusCode else { 
     print("Status code was \(httpResponse.statusCode), but expected 2xx") 
     return 
    } 

    // everything OK, process `data` here 
} 
task.resume() 

Я также сделал несколько изменений (обновление для Swift 3 и более поздних версий, использование URLSession, а не URLConnection, я думаю, что error является прекрасным выбором для имени переменной, я предпочитаю синтаксис закрывающего закрытия, я склонен использовать предполагаемые типы для параметров закрытия, чтобы сделать объявление немного более кратким и т. д.), но все это несущественно для рассматриваемого вопроса: Надеюсь, это иллюстрирует, как проверять код состояния.

Для получения Свифт 2, см. previous revision of this answer.

+0

спасибо. Я также решил не сдаваться и, ожидая чью-то помощь, написал еще один код (работает!), Но ваш кажется лучше и немного более аккуратным) Вот что я сделал, чтобы запросить (при попытке сделать что-то работоспособное я): 'let urlPath: String = allLinks [i] var url: NSURL = NSURL (строка: urlPath)! Запрос var: NSURLRequest = NSURLRequest (URL: url) ' Итак, шаг за шагом идет по каждой ссылке в массиве и запросы на них, потому что этот код сам, если внутри цикла for. И большое спасибо за объяснения. Хотел бы я проголосовать, но репутация ( –

Смежные вопросы