【问题标题】:nsMutableUrl addvalue adding quotes "" around keynsMutableUrl addvalue 在键周围添加引号“”
【发布时间】:2014-07-27 18:39:55
【问题描述】:

我的最终目标是一个带有开关的简单 iPhone 视图,当该开关“打开”时,会向我的 Spark Core(wifi 微芯片)发送一个发布请求以打开继电器。

我正在努力以适用于发布请求的格式添加参数。这在 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,其中键参数没有引号而值有引号。

谢谢!

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

Stack 再过几个小时都不让我回答我自己的问题,所以这里是解决问题的工作代码: 谢谢 Jonah - 我从一位朋友那里了解到 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

【问题讨论】:

    标签: swift httprequest nsmutableurlrequest sparkcore


    【解决方案1】:

    Spark 要求您在请求正文而不是标头中发送访问令牌。

    尝试以下方法:

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

    然后在请求中:

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

    【讨论】:

      【解决方案2】:

      根据我的经验,访问令牌需要是授权标头的一部分。试试这个

       request.setValue("access_token="\(YourAccessToken)", forHTTPHeaderField:"Authorization")
      

      【讨论】:

      • 感谢您的快速回复!我发现将其设置为 auth 标头不起作用,但一位朋友告诉我,Spark 要求键值对位于正文中,而不是标头中。我刚刚对其进行了测试并且它有效,所以我现在将发布该代码。
      猜你喜欢
      • 2017-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-16
      相关资源
      最近更新 更多