Какао и Swift - я хочу сделать простой вызов API отдыха, используя Swift 4 и приложение Cocoa для Mac OS - PullRequest
0 голосов
/ 03 октября 2018

Может кто-нибудь предложить мне, как сделать api-вызов rest для приложения Mac OS, используя Swift 4 и Cocoa.Я пробовал много способов, но не смог сделать вызов API.

Вот код:

func callAPI(){

    let AuthorizationToken = "Basic mykey="
    var request = URLRequest(url: URL(string: "http://myipaddress/api/Batch")!)
    request.httpMethod = "GET"
    request.addValue("application/json", forHTTPHeaderField: "Content-Type")
    request.setValue(AuthorizationToken, forHTTPHeaderField: "Authorization")
    let session = URLSession.shared
    let task = session.dataTask(with: request, completionHandler: { data, response, error -> Void in
        //print(response!)
        do {
            let json = try JSONSerialization.jsonObject(with: data!)
            print(json)
            self.ApiValue.stringValue = "Success"
        } catch {
            print("error")
            self.ApiValue.stringValue = "Error"
        }
    })

    task.resume()

}

См. Info.plist

Ответы [ 3 ]

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

Так же, как временный взлом, просто удалите ключ NSExceptionDomains и все, что под ним.Затем повторите тестирование и посмотрите, работает ли оно.

Имейте в виду, это полностью отключает безопасность ATS и не рекомендуется.На самом деле у вас должен быть правильный домен для вашего сервера и указывать в нем правильный домен в ключе NSExceptionDomains (вместо example.com).

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

Я решил это.В новом обновлении swift необходима конфигурация NSAppTransportSecurity.Я добавил следующий код в мой файл info.plist.

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
    <key>NSExceptionDomains</key>
    <dict>
        <key>yourdomain.com</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
            <false/>
        </dict>
    </dict>
</dict>

Затем также необходимо разрешить сетевое входящее и исходящее соединение в AppSandBox-> Capabilities, затем все установить.

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

data со стороны сервера - nil, поэтому вы получаете сообщение об ошибке типа

Неожиданно обнаружен ноль при развертывании необязательного значения

Это не хорошоИдея использовать принудительное развертывание для необязательного значения

Я проверил ваш код и вижу проблему:

Безопасность транспорта заблокировала загрузку открытого текста HTTP (http://), поскольку она небезопасна)Временные исключения могут быть настроены через файл Info.plist вашего приложения.

Вы можете исправить это, добавив этот код в plist:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
    <key>NSExceptionDomains</key>
    <dict>
        <key>example.com</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

Более подробную информацию вы можете найти here

Я протестировал код с обновлением plist-файла и получил этот json со стороны сервера без ошибок:

{
        batchID = BA000000015;
        code = 2015;
        coordinatorName = "<null>";
        createdBy = Suc19320182015;
        createdByID = LU000000011;
        createdOn = "2018-08-14T06:37:43";
        endDate = "2018-08-14T00:00:00";
        name = SSDG;
        schoolID = BS00001;
        startDate = "2018-08-14T00:00:00";
        status = 1;
        updatedBy = Suc19320182015;
        updatedOn = "2018-08-14T06:37:51";
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...