0

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

HTTP请求必须包含一个参数key,它等于我访问API的API key和包含图像数据和API相关数据的JSON。

带有请求参数的 URL 如下所示: https ://vision.googleapis.com/v1/images:annotate?key=My_API_Key 并且 JSON 结构位于 此链接。

我的 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(类似于我的请求的 key:My_API_Key 部分)。并使用 .JSON 作为编码选项将参数参数添加为请求的 JSON 正文。我该怎么做(要进行 URL 编码的参数键和要添加到 HTTP 正文的 JSON 数据)?Alamofire 的请求方法似乎正在使用相同的参数执行这两种方法中的任何一种。

我尝试创建一个 NSURLMutableRequest 并添加正文。但是在访问 SwiftyJSON JSON 对象的 rawValue 时,出现以下错误。错误:调用可以抛出,但它没有用'try'标记,并且如果让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 进行编码?

4

0 回答 0