如何使用Alamofire将SwiftyJSON对象的JSON主体添加到包含不同参数的POST请求中?

时间:2016-03-28 12:01:43

标签: json swift http alamofire google-cloud-vision

我在SO中阅读答案并检查了官方的Alamofire文档,但大多数答案都增加了JSON数据是否被添加到URL参数或正文中的混淆。

HTTP请求必须包含一个参数键,它等于我访问API的API密钥和包含图像数据的JSON以及与API相关的一些数据。

带有request参数的URL如下所示: https://vision.googleapis.com/v1/images:annotate?key=My_API_Key 并且JSON结构位于This link.

我的Swift代码看起来像这样。

import SwiftyJSON
import Alamofire
    // all imports are done

func requestAPI(body:JSON) -> JSON {
    let APIKey:String = "My_API_KEY"
      let header = ["Content-Type":"application/json"]
      let url:String = "https://vision.googleapis.com/v1/images:annotate"
      let parameters = ["key":APIKey]
      var response = Alamofire.request(.POST,url,headers:header,parameters:parameters)
      response.validate().responseJSON { response in
        switch response.result {
        case .Success:
          if let value = response.result.value {
            let json = JSON(value)
            print("JSON: \(json)")
            print(response.request)
          }
        case .Failure(let error):
          print(error)
        }
      }
return body //dummy return
}

我确实通过了Alamofire文档。 来自 使用URL编码参数的POST请求 文档部分,

let parameters = [
    "foo": "bar",
    "baz": ["a", 1],
    "qux": [
        "x": 1,
        "y": 2,
        "z": 3
    ]
]

Alamofire.request(.POST, "https://httpbin.org/post", parameters: parameters)
// HTTP body: foo=bar&baz[]=a&baz[]=1&qux[x]=1&qux[y]=2&qux[z]=3

我对此的理解是,作为参数传递的JSON被添加为HTTp POST请求的URL(类似于我的请求的密钥:My_API_Key部分)的参数。并使用.JSON作为编码选项将参数参数添加为请求的JSON主体。我该怎么做(要进行URL编码的参数键和要添加到HTTP正文的JSON数据)? Alamofire的请求方法似乎是使用相同的参数进行2中的任何一个。

我尝试创建NSURLMutableRequest并添加正文。但是在访问SwiftyJSON JSON对象的rawValue时,我收到以下错误。 错误:电话可以抛出,但没有标记为'尝试'并且不处理错误   如果让bodyData:NSData = body.rawData(){

这是代码。

func requestAPI(body:JSON) -> JSON {
  let APIKey:String = "My_API_Key"
  let header = ["Content-Type":"application/json"]
  let url = NSURL(string:"https://vision.googleapis.com/v1/images:annotate")
  let parameters = ["key":APIKey]
  var request = NSMutableURLRequest(URL:url!)
  request.HTTPMethod = "POST"
  if let bodyData:NSData = body.rawData(){
    request.HTTPBody = bodyData
  }
  let encoding = Alamofire.ParameterEncoding.URL
  (request, _) = encoding.encode(request, parameters: parameters) // Parameters are added here
  var response = Alamofire.request(.POST,url!,headers:header,parameters:parameters)
  response.validate().responseJSON { response in
    switch response.result {
    case .Success:
      if let value = response.result.value {
        let json = JSON(value)
        print("JSON: \(json)")
        //return json
        print(response.request)
      }
    case .Failure(let error):
      print(error)
    }
  }

  return body //dummy return
}

在何处以及如何将请求的HTTP主体设置为JsonData并使用参数对URL进行编码?

0 个答案:

没有答案