Die Backend-APIs, mit denen ich arbeite, erfordern ein Token, das mit jeder Anfrage gegen den HTTP-Header-Schlüssel Authorization
in diesem Format gesendet wird - Token xxxxxxxxxx
.Wie man ein 'Token xxxxxxxxxx' für 'Authorization' im HTTP-Header in URLSession setzt
Im Moment mache ich folgendes.
var getRequest = URLRequest(url: url)
getRequest.addValue("Token xxxxxxxx", forHTTPHeaderField: "Authorization")
Das funktioniert manchmal und einige andere Zeiten wird der Header-Feld Authorization
abgezogen, wenn die Anforderung aus gesendet wird. Ich habe das mit Charles Proxy überprüft.
Apple's documentation besagt Folgendes.
Ein NSURLSession-Objekt wurde entwickelt, um verschiedene Aspekte des HTTP-Protokolls für Sie zu behandeln. Als Ergebnis sollten Sie die folgenden Header nicht ändern: Berechtigung, Verbindung, Host, WWW-Authenticate
Als Lösung dieses Problems, viele vorschlagen, mit der didReceiveAuthenticationChallenge
Delegatmethode für URLSession.
Hier müssen Sie eine URLSession.AuthChallengeDisposition
Instanz übergeben, um anzugeben, wie Sie auf die Herausforderung reagieren möchten, und eine URLCredential
Instanz, um die Anmeldeinformationen zur Beantwortung der Authentifizierungsanforderung zu übergeben.
Ich weiß nicht, wie und ob ich eine URLCredential
Instanz erstellen kann, die für das Header-Feld Authorization
hinzufügen wird.
Kann jemand sachkundiger bitte helfen Sie mir, wie man das löst?
PS - Alle in dieser Frage genannten Code ist in Swift 3. This question fragt etwas, was ich ähnlich habe. Aber die Antworten, die dort gegeben werden, funktionieren nicht für mich. Und einige der Fragen, die unter den Fragen gestellt wurden, die Apple nicht erlauben, Header für Authorization
hinzuzufügen, sind unbeantwortet geblieben.
Bearbeiten:
Buchung relevanten Code.
var getRequest = URLRequest(url: url)
getRequest.httpMethod = "GET"
getRequest.addValue("application/json", forHTTPHeaderField: "Content-Type")
getRequest.addValue("application/json", forHTTPHeaderField: "Accept")
let token = DataProvider.sharedInstance.token
getRequest.addValue("Token \(token)", forHTTPHeaderField: "Authorization")
let getTask = URLSession.shared.dataTask(with: getRequest) { (data, response, error) in
if let data = data {
print("--------GET REQUEST RESPONSE START--------")
print("CODE: \((response as? HTTPURLResponse)?.statusCode ?? 0)")
print("Response Data:")
print(String(data: data, encoding: .utf8) ?? "")
print("--------GET REQUEST RESPONSE END--------")
}
}
getTask.resume()
Hier kann ich bestätigen, dass das Kopfzeilenfeld für 'Authorization' zum Header-Wörterbuch der Anfrage hinzugefügt wird.
Aber wenn ich überprüfe, welche Anfrage den Server trifft, fehlt das Header-Feld für 'Authorization'. Irgendwelche Gedanken?
'request.addValue (Wert, forHTTPHeaderField: key)' funktioniert nach meiner Erfahrung zuverlässig. Ich vermute, dass Ihr Code in "Problemsituationen" nicht für die Anfrage aufgerufen wird. Bitte posten Sie relevanteren Code, um dies herauszufinden. – shallowThought
@ShallowThought Ich habe relevanten Code hinzugefügt. Bitte sehen Sie, ob Sie etwas falsch finden, was ich getan habe. –