2

I’m trying to converting the the following curl request Swagger gives me to URLRequest:

curl -X GET --header 'Accept: application/json' 
--header 'Authorization: key ttn-account-v2.<app-key>'
 'https://<app-id>.data.thethingsnetwork.org/api/v2/query'

URL and Headers are set correctly. Still I get the response: 401 - Not authorized.

let key = "ttn-account-v2.<app-key>"

let url = URL(string: "https://<app-id>.data.thethingsnetwork.org/api/v2/query")

var request = URLRequest(url: url!)

request.httpMethod = "GET"
request.addValue("application/json", forHTTPHeaderField: "Accept")
request.addValue("key \(key)", forHTTPHeaderField: "Authorization")

let task = URLSession.shared.dataTask(with: url!) { data, response, error in
    guard error == nil else {
        print(error!)
        return
    }
    guard let data = data else {
        print("Data is empty")
        return
    }

    let json = try! JSONSerialization.jsonObject(with: data, options: [])
    print(json)
}
task.resume()

Am I missing something?

ChrisTheGreat
  • 512
  • 4
  • 21
  • are you sure that key header is correct? check if it does not send it as Optional(...) – Lu_ Oct 16 '17 at 21:06

1 Answers1

5

What is going wrong is that you create a perfect request but then skip it all together by doing a dataTask with just the url and not the request. This way the HTTPHeaders aren't send with the request, thus it is not authorised. Just change the task creation line to this:

let task = URLSession.shared.dataTask(with: req) { data, response, error in 
    ...
}
Eric
  • 1,210
  • 8
  • 25