2017-10-16 11 views
1

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()에 들어갈 수는 없기 때문에 개인 메서드. 어떤 도움을 주셔서 감사합니다.

답변

1

"+"문자 인코딩에 문제가 있습니다. 대신 다음을 시도해보십시오.

let postData = NSMutableData(data: "username=james%[email protected]".data(using: .utf8)!) 
+1

@ JamesJordanTaylor : 공간에 문제가있는 것 같습니다. 사실 서버가 JSON 타입을 받아들이면 NSJSONSerialization을 사용하여 json에서 데이터 객체를 생성하고 문자열에 utf8을 사용하는 대신 서버에 전달하는 것이 좋습니다. –

+0

실제 문제는 Content-Type 헤더를 설정하는 것을 잊었다는 것입니다. 본문 데이터의 처리는 그것 없이는 정의되지 않습니다. iOS의 기본 콘텐츠 유형이 무엇이든 제공되면 서버가 아마도 당신을 위해 해독을 수행하고있을 것입니다. – dgatwood