x-www-form-endoded 데이터를 사용하여 API에 대한 로그인 호출을 만들고 있습니다. 우체부에서 POST를 작성하고 200 응답을 받았습니다. Postman의 내보내기 기능을 사용하여 Android 용 OKHTTP 코드와 iOS 용 NSURL 코드를 생성했습니다. Android 코드는 정상적으로 작동하지만 iOS 코드는 401 응답을받습니다. 나는 찰스 웹 디버깅 프록시를 사용하여 실제로 페이로드로 보내지는 것을 살펴 보았다. 안드로이드의 경우 사용자 이름이 "[email protected]"으로 올바르게 표시되지만 iOS에서는 "username = james [email protected]"으로 표시됩니다. 내 아이폰 OS 코드는 다음과 같습니다 :iOS UrlSession.shared.dataTask가 utf-8 "+"문자를 제거하고이를 ""로 바꿉니다.
let headers = [
"accept": "application/json",
"cache-control": "no-cache",
"content-type": "application/x-www-form-urlencoded"
]
let postData = NSMutableData(data: "username=james+jy[email protected]".data(using: .utf8)!)
postData.append("&password=redacted".data(using: .utf8)!)
postData.append("&grant_type=password".data(using: .utf8)!)
postData.append("&client_id=redacted".data(using: .utf8)!)
postData.append("&client_secret=redacted".data(using: .utf8)!)
let request = NSMutableURLRequest(url: NSURL(string: "https://redacted.com/api/oauth2/token/")! as URL,
cachePolicy: .useProtocolCachePolicy,
timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data
let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
if (error != nil) {
print(error)
} else {
let httpResponse = response as? HTTPURLResponse
print(httpResponse)
}
})
나는 아이폰 OS 코드를 강화하면 NSMutableData 및 데이터가 모두 "[email protected]"그냥 URLSession.shared로 떠나는로 사용자 이름을 표시 제대로 객체 오류의 잠재적 인 원인. 하지만 URLSession.shared.dataTask()에 들어갈 수는 없기 때문에 개인 메서드. 어떤 도움을 주셔서 감사합니다.
@ JamesJordanTaylor : 공간에 문제가있는 것 같습니다. 사실 서버가 JSON 타입을 받아들이면 NSJSONSerialization을 사용하여 json에서 데이터 객체를 생성하고 문자열에 utf8을 사용하는 대신 서버에 전달하는 것이 좋습니다. –
실제 문제는 Content-Type 헤더를 설정하는 것을 잊었다는 것입니다. 본문 데이터의 처리는 그것 없이는 정의되지 않습니다. iOS의 기본 콘텐츠 유형이 무엇이든 제공되면 서버가 아마도 당신을 위해 해독을 수행하고있을 것입니다. – dgatwood