【问题标题】:How to write a POST request using Alamofire and swift 4 for the Clarifai API?如何使用 Alamofire 和 swift 4 为 Clarifai API 编写 POST 请求?
【发布时间】:2018-11-10 16:42:21
【问题描述】:

我对 Swift 网络比较陌生,尤其是 POST 请求。我已经阅读了 Clarifai API 和 Alamofire 的文档,但还没有完全弄清楚如何使用 Alamofire 编写工作请求。到目前为止,我发现以下代码创建了一个符合 Clarifai API 的结构,它希望请求的结构如下:

curl -X POST \
  -H "Authorization: Key YOUR_API_KEY" \
 -H "Content-Type: application/json" \
-d @https://api.clarifai.com/v2/models/aaa03c23b3724a16a56b629203edc62c/outputs << FILEIN
 {
   "inputs": [
    {
    "data": {
      "image": {
        "base64": "$(base64 /home/user/image.png)"
      }
    }
  }
]
}
FILEIN

这是我发现的 swift 代码,它完全实现了这一点:

struct ImageObj: 可编码 { 让base64:字符串 }

    struct DataObj: Codable {
        let image: ImageObj
    }
    
    struct InputObj: Codable {
        let data: DataObj
    }
    
    struct InputsContainerObj: Codable {
        let inputs: [InputObj]
    }
    
    let imageObj = ImageObj(base64: "abc123")
    let dataObj = DataObj(image: imageObj)
    let inputObj = InputObj(data: dataObj)
    let inputsContainerObj = InputsContainerObj(inputs: [inputObj])
    
    let encoder = JSONEncoder()
    do {
        let jsonData = try encoder.encode(inputsContainerObj)
        let jsonString = String(data: jsonData, encoding: .utf8)!
        
        print(jsonString) //{"inputs":[{"data":{"image":{"base64":"abc123"}}}]}
    } catch _ as NSError {
        
    }

现在我不知道在此之后我应该做什么。我尝试使用 POST 编写 Alamofire 请求,但被参数卡住了?和编码?对于参数我尝试了类似的东西:

let parameters: Parameters = [
        "Authorization: Key":"xxxxxxxxxxxxxxxxxxxxxxxx",
    "Content-Type":"application/json"]

但我不知道它是否正确。如果有人可以在这里帮助我,我将不胜感激!祝大家有个愉快的一天!

【问题讨论】:

  • 嗨!我也在尝试使用 Alamofire 设置 clarifai 的 REST API,但似乎无法正确设置。你找到解决方案了吗?谢谢!
  • 没有,还没找到……
  • 有趣。当我尝试运行我的代码时,我收到一个无效或格式错误的请求错误。
  • 是的,我得到了同样的错误。
  • 您能否准确提供您看到的错误? alamofire 请求是什么样的(如果可能的话)。很难知道这里可能出了什么问题。

标签: json swift post alamofire clarifai


【解决方案1】:

看起来您已经从对象和标头(您称它们为“参数”)构造了 jsonString。您应该可以通过以下方式发送:

let headers: [String: AnyObject] = [
    "Authorization: Key":"xxxxxxxxxxxxxxxxxxxxxxxx",
    "Content-Type":"application/json"
]

Alamofire.request(.POST, "https://api.clarifai.com/v2/inputs", parameters: jsonString, headers: headers, encoding: .JSON)
    .responseJSON { request, response, JSON, error in
        print(response)
        print(JSON)
        print(error)
    }

我已将它们重新命名为标题,以使其在上面更加清晰。请注意,我已经掩盖了授权密钥(无论是在答案中还是在原始问题中)——通常你不希望将其分享给公众。

【讨论】:

    猜你喜欢
    • 2019-04-13
    • 2019-03-17
    • 2020-02-10
    • 1970-01-01
    • 2016-11-25
    • 1970-01-01
    • 2015-11-23
    • 2018-10-25
    • 1970-01-01
    相关资源
    最近更新 更多