0

SO で回答を読み、公式の Alamofire ドキュメントを確認しましたが、これらの回答のほとんどは、JSON データが URL パラメーターまたは本文に追加されるかどうかで混乱を招きます。

HTTP 要求には、API にアクセスするための API キーと同じパラメーター キーと、画像データと 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 の request メソッドは、同じ引数を使用して 2 つのいずれかを行っているようです。

NSURLMutableRequest を作成して本文を追加してみました。しかし、SwiftyJSON JSON オブジェクトの rawValue にアクセスしているときに、次のエラーが発生します。エラー: 呼び出しはスローできますが、'try' でマークされておらず、let 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