Поддерживается ли URLSession в Linux? - PullRequest
0 голосов
/ 04 октября 2018

При попытке получить доступ к оксфордскому словарю api с помощью swift в Linux я нашел препятствие.Это может быть какая-то ошибка, которую я делаю, но я не могу определить, что это.На данный момент я подозреваю, что-то связано с базовой ОС.Поэтому, пожалуйста, рассмотрите код bash:

curl -X GET --header 'Accept: text/plain' --header 'app_id: 8a7dd147' --header 'app_key: 7e7d022fbce6d8d4523eac3baa5bd04c' 'https://od-api.oxforddictionaries.com/api/v1/entries/en/ace'

, который возвращает данные json для слова Ace.Теперь в Ubuntu 18.04 я пробую следующее:

import Foundation
//var request = URLRequest(url: URL(string: "https://od-api.oxforddictionaries.com/api/v1/entries/en/love")!)

// TODO: replace with your own app id and app key
let appId = "8a7dd147"
let appKey = "7e7d022fbce6d8d4523eac3baa5bd04c"
let language = "en"
let word = "Ace"
let word_id = word.lowercased() //word id is case sensitive and lowercase is required
let url = URL(string: "https://od-api.oxforddictionaries.com/api/v1/entries/en/love")!  // \(language)/\(word_id)")!
var request = URLRequest(url: url)
request.addValue("application/json", forHTTPHeaderField: "Accept")
request.addValue(appId, forHTTPHeaderField: "app_id")
request.addValue(appKey, forHTTPHeaderField: "app_key")
//request.addValue("application/json", forHTTPHeaderField: "Content-Type")
print("passed request addValue")

let session = URLSession.shared
_ = session.dataTask(with: request, completionHandler: { data, response, error in
    if let response = response,
        let data = data,
        let jsonData = try? JSONSerialization.jsonObject(with: data, options: .mutableContainers) {
            print("about to give you a response")
        print(response)
        print(jsonData)
    } else {
        print(error)
        print(NSString.init(data: data!, encoding: String.Encoding.utf8.rawValue))
    }
}).resume()

Или следующее:

import Foundation

let params: [String: String] = ["app_id": "8a7dd147", "app_key": "7e7d022fbce6d8d4523eac3baa5bd04c"]

var request = URLRequest(url: URL(string: "https://od-api.oxforddictionaries.com/api/v1/entries/en/love")!)
request.httpMethod = "GET"
request.addValue("application/json", forHTTPHeaderField: "Accept")
request.addValue("8a7dd147", forHTTPHeaderField: "app_id")
request.addValue("7e7d022fbce6d8d4523eac3baa5bd04c", forHTTPHeaderField: "app_key")

URLSession.shared.dataTask(with: request, completionHandler: { data, response, error -> Void in
    print(response!)
    do {
        let json = try JSONSerialization.jsonObject(with: data!)
        print(json)
        print("we did it!")
    } catch {
        print("error")
    }
}).resume()

//task.resume()

Но ни один из них не возвращает информацию json для слова "любовь".Я пытался отладить это и не могу понять, что не так.

  • Это связано с ОС, таким образом, ошибка?Может ли кто-нибудь проверить это на MacOS.Или я что-то упустил?

1 Ответ

0 голосов
/ 04 октября 2018

URLSession выполняет вещи в фоновых потоках.И когда вы завершаете основной поток многопоточной программы, все потоки завершаются (за исключением того, что в некоторых языках, таких как Java, вы можете установить поток Daemon, который может быть другим потоком, но завершение программы будет после его окончания).вместо этого).

Итак, ваше решение - продлить срок службы вашего основного потока, например:

let group = DispatchGroup.init()

group.enter() // Use this before making anything that needs to be waited for
              // This manually add one to operation count in the dispatch group
URLSession.shared.dataTask(with: request, completionHandler: { data, response, error -> Void in
    defer {  // Defer makes all ends of this scope make something, here we want to leave the dispatch.
             // This is executed when the scope ends, even if with exception.


       group.leave() // Manually subtract one from the operation count
    }
    print(response!)
    do {
        let json = try JSONSerialization.jsonObject(with: data!)
        print(json)
        print("we did it!")
    } catch {
        print("error")
    }
}).resume()

group.wait()  // Wait for group to end operations.

Но тем лучше, что вы не блокируете основной поток вВ реальных приложениях, таких как, например, веб-приложения, ваше приложение обычно живет больше, чем запросы, поэтому вам не нужно вмешиваться, но старайтесь не блокировать пользователя (sleep, DispatchGroup.wait, за исключением случаев, когда используется фоновый поток и т. д.)....)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...