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 をエンコードする場所と方法を教えてください。