Получение & ldquo; недопустимый формат значения заголовка авторизации & rdquo; используя Alamofire в Swift для выполнения запроса https [duplicate]

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

Вы пишете

lst = [[1] * 4] * 3

Это эквивалентно:

lst1 = [1]*4
lst = [lst1]*3

Это означает, что lst - это список с 3 элемента, указывающие на lst1. Это означает, что две следующие строки эквивалентны:

lst[0][0] = 5
lst1[0] = 5

Поскольку lst[0] - это только lst1.

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

lst = [ [1]*4 for n in xrange(3) ]

В этом случае выражение переоценивается для каждого n, что приводит к другому списку.

68
задан MrKos 24 June 2014 в 09:03
поделиться

8 ответов

Вы предоставляете учетные данные в экземпляре URLRequest, например, в Swift 3:

let username = "user"
let password = "pass"
let loginString = String(format: "%@:%@", username, password)
let loginData = loginString.data(using: String.Encoding.utf8)!
let base64LoginString = loginData.base64EncodedString()

// create the request
let url = URL(string: "http://www.example.com/")!
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.setValue("Basic \(base64LoginString)", forHTTPHeaderField: "Authorization")

// fire off the request
// make sure your class conforms to NSURLConnectionDelegate
let urlConnection = NSURLConnection(request: request, delegate: self)

Или в NSMutableURLRequest в Swift 2:

// set up the base64-encoded credentials
let username = "user"
let password = "pass"
let loginString = NSString(format: "%@:%@", username, password)
let loginData: NSData = loginString.dataUsingEncoding(NSUTF8StringEncoding)!
let base64LoginString = loginData.base64EncodedStringWithOptions([])

// create the request
let url = NSURL(string: "http://www.example.com/")
let request = NSMutableURLRequest(URL: url)
request.HTTPMethod = "POST"
request.setValue("Basic \(base64LoginString)", forHTTPHeaderField: "Authorization")

// fire off the request
// make sure your class conforms to NSURLConnectionDelegate
let urlConnection = NSURLConnection(request: request, delegate: self)
128
ответ дан Nate Cook 19 August 2018 в 00:29
поделиться
  • 1
    request.setValue (base64LoginString, forHTTPHeaderField: & quot; Авторизация & quot;) = & gt; request.setValue ("Basic (base64LoginString)", forHTTPHeaderField: "Authorization"), я добавил слово "Basic" и он работает для меня хорошо – MrKos 24 June 2014 в 10:53
  • 2
    Хороший улов! Обновлен ответ. – Nate Cook 24 June 2014 в 11:37
  • 3
    'NSDataBase64EncodingOptions.Type' не имеет члена с именем 'fromMask'. Это ошибка, которую я получаю в Xcode 6.1..Pls help..Что такое маска (0) – Bala Vishnu 27 October 2014 в 11:18
  • 4
    @BalaVishnu Я также получаю эту ошибку – jskidd3 1 November 2014 в 12:10
  • 5
    Я также вижу то же сообщение, что @BalaVishnu в xCode, но я просто использовал .allZeros вместо этого – Sean Larkin 3 December 2014 в 22:01

swift 4:

let username = "username"
let password = "password"
let loginString = "\(username):\(password)"

guard let loginData = loginString.data(using: String.Encoding.utf8) else {
    return
}
let base64LoginString = loginData.base64EncodedString()

request.httpMethod = "GET"
request.setValue("Basic \(base64LoginString)", forHTTPHeaderField: "Authorization")
0
ответ дан Amr 19 August 2018 в 00:29
поделиться

перейти к SWIFT 3 и APACHE простому Auth:

func urlSession(_ session: URLSession, task: URLSessionTask,
                didReceive challenge: URLAuthenticationChallenge,
                completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {

    let credential = URLCredential(user: "test",
                                   password: "test",
                                   persistence: .none)

    completionHandler(.useCredential, credential)


}
3
ответ дан ingconti 19 August 2018 в 00:29
поделиться

мое решение работает следующим образом:

import UIKit


class LoginViewController: UIViewController, NSURLConnectionDataDelegate {

  @IBOutlet var usernameTextField: UITextField
  @IBOutlet var passwordTextField: UITextField

  @IBAction func login(sender: AnyObject) {
    var url = NSURL(string: "YOUR_URL")
    var request = NSURLRequest(URL: url)
    var connection = NSURLConnection(request: request, delegate: self, startImmediately: true)

  }

  func connection(connection:NSURLConnection!, willSendRequestForAuthenticationChallenge challenge:NSURLAuthenticationChallenge!) {

    if challenge.previousFailureCount > 1 {

    } else {
        let creds = NSURLCredential(user: usernameTextField.text, password: passwordTextField.text, persistence: NSURLCredentialPersistence.None)
        challenge.sender.useCredential(creds, forAuthenticationChallenge: challenge)

    }

}

  func connection(connection:NSURLConnection!, didReceiveResponse response: NSURLResponse) {
    let status = (response as NSHTTPURLResponse).statusCode
    println("status code is \(status)")
    // 200? Yeah authentication was successful
  }


  override func viewDidLoad() {
    super.viewDidLoad()

  }

  override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()

  }  
}

Этот класс можно использовать как реализацию ViewController. Подключите свои поля к аннотированным VAR-файлам IBOutlet и вашей Button к аннотированной функции IBAction.

Объяснение: При входе в функцию вы создаете свой запрос с NSURL, NSURLRequest и NSURLConnection. Существенным здесь является делегат, который ссылается на этот класс (сам). Для приема вызовов делегатов вам необходимо

  • Добавить протокол NSURLConnectionDataDelegate в класс
  • Реализовать функцию протокола «connection: willSendRequestForAuthenticationChallenge». Это используется для добавления учетных данных в запрос
  • Реализация функции протокола «connection: didReceiveResponse» Это проверит код состояния ответа HTTP
1
ответ дан Oliver Koehler 19 August 2018 в 00:29
поделиться
  • 1
    Есть ли способ проверить код статуса ответа HTTP для синхронного запроса? – Matt 28 August 2014 в 21:27
  • 2
    NSURLConnection устарел. Apple настоятельно рекомендует использовать NSURLSession. – Sam Soffes 17 December 2015 в 18:42

У меня была аналогичная проблема с попыткой POST для MailGun для некоторых автоматических писем, которые я реализовал в приложении.

Мне удалось получить эту работу с большим HTTP-ответом. Я поместил полный путь в Keys.plist, чтобы я мог загрузить свой код в github и разбить некоторые аргументы на переменные, чтобы я мог их программно установить позже по дороге.

// Email the FBO with desired information
// Parse our Keys.plist so we can use our path
var keys: NSDictionary?

if let path = NSBundle.mainBundle().pathForResource("Keys", ofType: "plist") {
    keys = NSDictionary(contentsOfFile: path)
}

if let dict = keys {
    // variablize our https path with API key, recipient and message text
    let mailgunAPIPath = dict["mailgunAPIPath"] as? String
    let emailRecipient = "bar@foo.com"
    let emailMessage = "Testing%20email%20sender%20variables"

    // Create a session and fill it with our request
    let session = NSURLSession.sharedSession()
    let request = NSMutableURLRequest(URL: NSURL(string: mailgunAPIPath! + "from=FBOGo%20Reservation%20%3Cscheduler@<my domain>.com%3E&to=reservations@<my domain>.com&to=\(emailRecipient)&subject=A%20New%20Reservation%21&text=\(emailMessage)")!)

    // POST and report back with any errors and response codes
    request.HTTPMethod = "POST"
    let task = session.dataTaskWithRequest(request, completionHandler: {(data, response, error) in
        if let error = error {
            print(error)
        }

        if let response = response {
            print("url = \(response.URL!)")
            print("response = \(response)")
            let httpResponse = response as! NSHTTPURLResponse
            print("response code = \(httpResponse.statusCode)")
        }
    })
    task.resume()
}

Путь Mailgun находится в Keys.plist как строка с именем mailgunAPIPath со значением:

https://API:key-<my key>@api.mailgun.net/v3/<my domain>.com/messages?

Надеюсь, что это поможет предложить решение кому-то, кто пытается избежать использования стороннего кода для своих запросов POST!

1
ответ дан Rudest Buddhist 19 August 2018 в 00:29
поделиться

В Swift 2:

extension NSMutableURLRequest {
    func setAuthorizationHeader(username username: String, password: String) -> Bool {
        guard let data = "\(username):\(password)".dataUsingEncoding(NSUTF8StringEncoding) else { return false }

        let base64 = data.base64EncodedStringWithOptions([])
        setValue("Basic \(base64)", forHTTPHeaderField: "Authorization")
        return true
    }
}
6
ответ дан Sam Soffes 19 August 2018 в 00:29
поделиться
  • 1
    Я не уверен, что вам нужно что-то избежать, прежде чем конвертировать его в base64 – Sam Soffes 19 February 2016 в 06:50

Я вызываю json при нажатии кнопки входа в систему

@IBAction func loginClicked(sender : AnyObject){

var request = NSMutableURLRequest(URL: NSURL(string: kLoginURL)) // Here, kLogin contains the Login API.


var session = NSURLSession.sharedSession()

request.HTTPMethod = "POST"

var err: NSError?
request.HTTPBody = NSJSONSerialization.dataWithJSONObject(self.criteriaDic(), options: nil, error: &err) // This Line fills the web service with required parameters.
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("application/json", forHTTPHeaderField: "Accept")

var task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in
 //   println("Response: \(response)")
var strData = NSString(data: data, encoding: NSUTF8StringEncoding)
println("Body: \(strData)")       
var err1: NSError?
var json2 = NSJSONSerialization.JSONObjectWithData(strData.dataUsingEncoding(NSUTF8StringEncoding), options: .MutableLeaves, error:&err1 ) as NSDictionary

println("json2 :\(json2)")

if(err) {
    println(err!.localizedDescription)
}
else {
    var success = json2["success"] as? Int
    println("Succes: \(success)")
}
})

task.resume()

}

Здесь я сделал отдельный словарь для параметров.

var params = ["format":"json", "MobileType":"IOS","MIN":"f8d16d98ad12acdbbe1de647414495ec","UserName":emailTxtField.text,"PWD":passwordTxtField.text,"SigninVia":"SH"]as NSDictionary
     return params
}
1
ответ дан siledh 19 August 2018 в 00:29
поделиться

// создать базу данных аутентификации base 64

    let PasswordString = "\(txtUserName.text):\(txtPassword.text)"
    let PasswordData = PasswordString.dataUsingEncoding(NSUTF8StringEncoding)
    let base64EncodedCredential = PasswordData!.base64EncodedStringWithOptions(NSDataBase64EncodingOptions.Encoding64CharacterLineLength)
    //let base64EncodedCredential = PasswordData!.base64EncodedStringWithOptions(nil)

// создать идентификатор аутентификации

    let urlPath: String = "http://...../auth"
    var url: NSURL = NSURL(string: urlPath)

// создать и инициализировать основной запрос аутентификации

    var request: NSMutableURLRequest = NSMutableURLRequest(URL: url)
    request.setValue("Basic \(base64EncodedCredential)", forHTTPHeaderField: "Authorization")
    request.HTTPMethod = "GET"

// Вы можете использовать один из методов ниже:

// 1 URL-запрос с NSURLConnectionDataDelegate

    let queue:NSOperationQueue = NSOperationQueue()
    let urlConnection = NSURLConnection(request: request, delegate: self)
    urlConnection.start()

// 2 Запрос URL с асинхронным Request

    NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) {(response, data, error) in
        println(NSString(data: data, encoding: NSUTF8StringEncoding))
    }

// 2 Запрос URL-адреса с AsynchronousRequest с json-выходом

    NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue(), completionHandler:{ (response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in
        var err: NSError
        var jsonResult: NSDictionary = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary
        println("\(jsonResult)")
    })

// 3 Запрос URL-адреса с SynchronousRequest

    var response: AutoreleasingUnsafePointer<NSURLResponse?>=nil
    var dataVal: NSData =  NSURLConnection.sendSynchronousRequest(request, returningResponse: response, error:nil)
    var err: NSError
    var jsonResult: NSDictionary = NSJSONSerialization.JSONObjectWithData(dataVal, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary
    println("\(jsonResult)")

// 4 Запрос URL с NSURLSession

    let config = NSURLSessionConfiguration.defaultSessionConfiguration()
    let authString = "Basic \(base64EncodedCredential)"
    config.HTTPAdditionalHeaders = ["Authorization" : authString]
    let session = NSURLSession(configuration: config)

    session.dataTaskWithURL(url) {
        (let data, let response, let error) in
        if let httpResponse = response as? NSHTTPURLResponse {
            let dataString = NSString(data: data, encoding: NSUTF8StringEncoding)
            println(dataString)
        }
    }.resume()

// вы можете получить фатальную ошибку, если вы изменили request.HTTPMethod = "POST", когда запрос запроса GET сервера

19
ответ дан Subhash 19 August 2018 в 00:29
поделиться
  • 1
    Кстати, это повторяет ошибку в коде OP: NSURLConnection(request: request, delegate: self) запускает запрос. Вы не должны start это второй раз. – Rob 20 July 2015 в 20:48
Другие вопросы по тегам:

Похожие вопросы: