7

ここで錬金術 API のドキュメントを読んでいます。

http://www.alchemyapi.com/api/image-tagging/image.html

彼らは、画像は URI でエンコードされている必要があると言っています...それは正確にはどういう意味ですか?

画像を base64 文字列に変換してからリクエストに渡すということですか?

試してみましたが、http 414 エラー - 要求 URI が大きすぎます。

リクエストが行われる私のコードは次のとおりです。

    @IBAction func analyzeImage(sender: UIButton) {

    var imageData = UIImagePNGRepresentation(mainImage.image)
    let base64ImageString = imageData.base64EncodedStringWithOptions(.allZeros)
    let requestString = ENDPOINT+"?apikey="+API_KEY+"&image="+base64ImageString+"&outputMode=json"


    let url = NSURL(string: requestString)
    let task = NSURLSession.sharedSession().dataTaskWithURL(url!) {(data, response, error) in
        println(NSString(data: data, encoding: NSUTF8StringEncoding))
    }

    task.resume()
}

編集: URIの長さを回避するために、GETの代わりにPOSTリクエストを使用するというDijkgraafの推奨事項を考慮しました。これを行うためにAlamofireライブラリを使用しています。これが私のコードです:

@IBAction func analyzeImage(sender: UIButton) {

    var imageData = UIImagePNGRepresentation(mainImage.image)
    let base64ImageString = imageData.base64EncodedStringWithOptions(.allZeros)

    let params = [
        "apikey" : API_KEY,
        "image"  : base64ImageString,
        "outputMode" : "json"]

    var manager = Manager.sharedInstance
    //Passing all the headers you want!
    manager.session.configuration.HTTPAdditionalHeaders = [
        "Content-Type": "application/x-www-form-urlencoded"
    ]
    manager.request(.POST, ENDPOINT, parameters:params, encoding: .URL)
        .response { (request, response, data, error) in
            println(request)
            println(response)
            println(error)
    }
}

ただし、これを試すと、「cannot-analyze:downstream-issue」というエラーが表示されます。

コンソール出力は次のとおりです。

<NSMutableURLRequest: 0x1742040c0> { URL: http://access.alchemyapi.com/calls/image/ImageGetRankedImageKeywords }
Optional(<NSHTTPURLResponse: 0x17082c1e0> { URL: http://access.alchemyapi.com/calls/image/ImageGetRankedImageKeywords } { status code: 200, headers {
    "Access-Control-Allow-Origin" = "*";
    "Cache-Control" = "no-cache";
    Connection = "keep-alive";
    "Content-Length" = 326;
    "Content-Type" = "application/json";
    Date = "Mon, 08 Jun 2015 05:59:22 GMT";
    Server = nginx;
    "X-AlchemyAPI-CurrentVersion" = "12.15";
    "X-AlchemyAPI-Error-Msg" = "cannot-analyze:downstream-issue";
    "X-AlchemyAPI-Key" = [API KEY HIDDEN];
    "X-AlchemyAPI-Params" = "sentiment=0&knowledgeGraph=0&detectedLanguage=unknown&submitLanguage=detect";
    "X-AlchemyAPI-Status" = ERROR;
    "X-AlchemyAPI-Total-Transactions" = 0;
} })
nil

何が問題なのかはわかりませんが、Alchemy のドキュメントには、POST リクエストの「Content-Type」ヘッダーを「application/x-www-form-urlencoded」に設定する必要があると記載されています。セットしてみます。これが問題でしょうか?

編集:Dijkgraafが提案したように、生の画像データだけを投稿しようとしました:

    @IBAction func analyzeImage(sender: UIButton) {

    var imageData = UIImagePNGRepresentation(mainImage.image)
    //let base64ImageString = imageData.base64EncodedStringWithOptions(.allZeros)
    var request = HTTPTask()
    request.requestSerializer = HTTPRequestSerializer()
    request.requestSerializer.headers["Content-Type"] = "application/x-www-form-urlencoded"
    let params: Dictionary<String,AnyObject> = [
        "apikey" : API_KEY,
        "imagePostMode" : "raw",
        "image" : imageData,
        "outputMode" : "json"]
    request.POST(ENDPOINT, parameters: params, completionHandler: {(response: HTTPResponse) in
        println(response.headers)
    })

}

しかし、ダウンストリームの問題を分析できないという同じエラーが再び発生します。

4

2 に答える 2

5

imagePostMode raw を使用する場合、画像データを POST リクエストの本文として送信する必要があり、パラメーターはエンドポイント URL に含める必要があります (たとえば、ENDPOINT="http://access.alchemyapi.com/calls/image/ ImageGetRankedImageKeywords?apikey=API_KEY&outputMode=json&imagePostMode=raw")。私は Swift を使ったことがないので、これを行う最善の方法はわかりませんが、予想とは少し異なります。

于 2015-06-11T14:01:15.653 に答える
2

以下のコードは私にとってはうまくいきます。

    let image = UIImage(named: "your-image.png")
    getImageTag(image!)

func getImageTag(image:UIImage){
        let apiKey = "xxx-xxx-xxx-xxx-xxx"
        let url = "https://gateway-a.watsonplatform.net/calls/image/ImageGetRankedImageKeywords?imagePostMode=raw&outputMode=json&apikey=" + apiKey
        let myURL = NSURL(string: url)!
        let request = NSMutableURLRequest(URL: myURL)
        request.HTTPMethod = "POST"
        request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
        let imageData = UIImagePNGRepresentation(image)

        request.HTTPBody = imageData!
        let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
        data, response, error in

            // Your completion handler code here
            if let error = error {
                print("error: \(error)")
            }
            print(response)
            print(NSString(data: data!, encoding: NSUTF8StringEncoding))
        }
    task.resume()
}

以下のように curl コマンドで Image Tagging Request をテストすることもできます。

 curl --data-binary @your_image.png "https://gateway-a.watsonplatform.net/calls/image/ImageGetRankedImageKeywords?imagePostMode=raw&apikey=d3a529b15ac9ebe550a51006815xxxxxx"
于 2015-11-30T13:26:02.240 に答える