nsMutableUrl addvalue добавление кавычек "" вокруг ключа

Моей конечной целью является простое представление iPhone с переключателем, который при включении отправляет почтовый запрос на мой Spark Core (микрочип Wi-Fi) для включения реле.

Я изо всех сил пытаюсь добавить параметры в формате, который работает для почтового запроса. Это работает в CLI:

curl https://api.spark.io/v1/devices/<myDeviceId>/led -d access_token=<myAccessToken> -d params=l1,LOW

Это моя попытка воспроизвести запрос в swift:

func toggleLight (on: Bool){
    var urlToUse = sparkAPIBaseURL+coreId+lightsMethodName
    var url = NSURL.URLWithString(urlToUse)
    var request = NSMutableURLRequest(URL: url)
    var session = NSURLSession.sharedSession()

    request.HTTPMethod = "POST"

    if (on==true) {
        request.setValue(paramsForOn, forHTTPHeaderField: "params")
    } else {
        request.setValue(paramsForOff, forHTTPHeaderField: "params")
    }//if

    request.setValue(accessToken, forHTTPHeaderField: "access_token")

    println("request: \(request)")

    var task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in println("response: \(response)")

        var strData = NSString(data: data, encoding: NSUTF8StringEncoding)
        println(strData)
        self.responseDataLabel.text = strData
    })//task

    task.resume()  //no idea what this does
}//toggleLight

В println показан запрос на добавление лишних кавычек вокруг ключа "access_token", что, по моему мнению, является проблемой:

request: <NSMutableURLRequest: 0x7a62a450> { URL: https://api.spark.io/v1/devices/<myDeviceId>/led, headers: {
"access_token" = <myAccessToken>;
params = "l1,LOW"; } }

Ответ показывает ошибку, что токен доступа не найден:

response: <NSHTTPURLResponse: 0x7b654c60> { URL: https://api.spark.io/v1/devices/<myDeviceId>/led } { status code: 400, headers {
"Access-Control-Allow-Origin" = "*";
Connection = "keep-alive";
"Content-Length" = 104;
"Content-Type" = "application/json; charset=utf-8";
Date = "Sun, 27 Jul 2014 18:21:45 GMT";
Server = "nginx/1.6.0";
"X-Powered-By" = Express;} }{
"code": 400,
"error": "invalid_request",
"error_description": "The access token was not found"}

Я пробовал setValue так же, как и addValue, но они оба, кажется, обрабатывают ключ access_token, добавляя кавычки и значение без кавычек, где ключевые параметры не имеют кавычек, а значение имеет.

Спасибо!

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~

Стек не позволит мне ответить на свой вопрос еще несколько часов, поэтому вот рабочий код, который решил эту проблему: Спасибо, Джона, - я узнал от друга, что Spark Core требует пары ключей-значений в теле, так что это рабочий код, который заставил меня преодолеть горб:

    func toggleLight (on: Bool){
    var urlToUse = sparkAPIBaseURL+coreId+lightsMethodName
    var url = NSURL.URLWithString(urlToUse)
    var request = NSMutableURLRequest(URL: url)
    var session = NSURLSession.sharedSession()

    request.HTTPMethod = "POST"

    var params: String
    if (on==true) {
        params = paramsForOn
    } else {
        params = paramsForOff
    }//if

    **var message = "access_token=\(accessToken)&params=\(params)"
    request.HTTPBody = (message as NSString).dataUsingEncoding(NSUTF8StringEncoding)**

    println("request: \(request)")

    var task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in println("response: \(response)")

        var strData = NSString(data: data, encoding: NSUTF8StringEncoding)
        println(strData)
        self.responseDataLabel.text = strData
    })//task

    task.resume()  //no idea what this does
}//toggleLight

2 ответа

Решение

Spark требует, чтобы вы отправили токен доступа в теле запроса, а не в заголовке.

Попробуйте следующее:

var message = "access_token=<token>&params=<your_params>" 

Тогда в запросе:

request.HTTPBody = (message as NSString).dataUsingEncoding(NSUTF8StringEncoding)

По моему опыту, токен доступа должен быть частью заголовка авторизации. Попробуй это

 request.setValue("access_token="\(YourAccessToken)", forHTTPHeaderField:"Authorization")
Другие вопросы по тегам