#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, иначе переданное вами значение, скорее всего, будет перезаписано.