Передача данных заголовка с помощью сеанса URL в приложении macOS, получение нулевого ответа

#swift #nsurlrequest #urlsession

Вопрос:

Мне нужно сделать вызов URLSession, в котором я передаю базовую аутентификацию, а также некоторые другие данные POST, но я не уверен, правильно ли я это настраиваю. Я получаю нулевой ответ. Процесс заключается в создании поискового запроса в базе данных документации.

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

У меня есть общая функция URLRequest, И я передаю флаги для того, что ей нужно делать (чтение файлов cookie, установка файлов cookie, аутентификация и т. Д.), Затем я передаю этот запрос общей функции URLSession.

Соответствующий раздел функции запроса для получения билета:

 //if we are getting the ticket
    if bGetTicket {
        if let dictData = dictData {
            request.httpMethod = "POST"
            
            if dictData.count > 0 {
                request.setValue("Application/json", forHTTPHeaderField: "Content-Type")
                guard let httpBody = try? JSONSerialization.data(withJSONObject: dictData, options: []) else {
                    print("Could not  convert dictData to JSON.")
                    return
                }
                request.httpBody = httpBody
            }
        } else {
            strErrMsg.append("There was a problem with the POST data, it was nil.nn")
            bIsValid = false
        }//end data check
    }//bGetTicket
 

это работает нормально, но когда я пытаюсь выполнить поисковый запрос, я получаю нулевой ответ:

 if bIsAuth {
        if let dictData = dictData {
            request.httpMethod = "POST"
            if dictData.count > 0 {
                
                if let strTicket = dictData["ticket"] as? String, let dictQuery = dictData["dictQuery"] as? Dictionary<String, Any> {
                    request.setValue("Application/json", forHTTPHeaderField: "Content-Type")
                    request.setValue("Basic (strTicket)", forHTTPHeaderField: "Authorization")
                    
                    guard let httpBody = try? JSONSerialization.data(withJSONObject: dictQuery, options: []) else {
                        print("Could not  convert dictData to JSON.")
                        return
                    }
                    request.httpBody = httpBody
                }
            }
        } else {
            strErrMsg.append("There was a problem with the POST data, it was nil.nn")
            bIsValid = false
        }//end data check
    }//end isAuth
 

Формат данных для поиска::

 {
    "query": {
        "query": "dog"
    }
}
 

и словарь, который я конвертирую в JSON, следует этому шаблону:

 ["query": ["query": "PSP"]]
 

Я получаю ноль в ответе, и когда я смотрю на заголовки запроса, данные поиска не прикрепляются:

 Optional(["Content-Type": "Application/json", "Authorization": "Basic TICKET_184e995ed8ea09881c3ba6edcf929c03ac7e283e"])
 

Может ли кто-нибудь указать, где я иду не так? Спасибо!

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

1. «когда я смотрю на заголовки запроса, данные поиска не прикрепляются:» разве вы не вставили их httpBody ? Вы напечатали только заголовки, а не тело.

2. Что такое парень по имени диктДата и откуда он берется?

3. @Larme Да, ты прав, долгий день. : ) Поисковый запрос прикреплен к телу: пусть значение строки = Строка(расшифровка: request.httpBody!, как: UTF8.self) печать(значение строки) дает ожидаемые результаты.

4. @ElTomato DictData-это данные записи, которые я передаю в запрос: func setUpRequest(_ strURL:Строка, _ bGetTicket:Bool, _ DictData:NSMutableDictionary?, _ bIsAuth:Bool, _ bSendCookie:Bool, _ bSetCookie:Bool, completed:@escaping Возвратное закрытие) {

Ответ №1:

Переопределение поля авторизации явно запрещено в соответствии с документацией NSURLSession. Это работает в некоторых ситуациях, но не в целом.

Если вы выполняете базовую аутентификацию, вы должны использовать фактические функции аутентификации API, иначе переданное вами значение, скорее всего, будет перезаписано.