Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 如何对图像进行URI编码?_Swift_Http_Alchemyapi - Fatal编程技术网

Swift 如何对图像进行URI编码?

Swift 如何对图像进行URI编码?,swift,http,alchemyapi,Swift,Http,Alchemyapi,我正在阅读alchemy API文档: 他们说图像必须是URI编码的。。。这到底是什么意思 这是否意味着将图像转换为base64字符串,然后将其传递给请求 我已经尝试过了,但是收到的http 414错误请求URI太大 以下是我提出请求的代码: @IBAction func analyzeImage(sender: UIButton) { var imageData = UIImagePNGRepresentation(mainImage.image) let base

我正在阅读alchemy API文档:

他们说图像必须是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()
}
编辑:我考虑了Dijkgraaf的建议,即使用POST请求,而不是开始处理URI长度。我正在使用阿拉莫菲尔图书馆来做这件事。这是我的密码:

@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)
    }
}
但是,当我尝试此操作时,会出现“无法分析:下游问题”错误

以下是控制台输出:

<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
{URL:http://access.alchemyapi.com/calls/image/ImageGetRankedImageKeywords }
可选({URL:http://access.alchemyapi.com/calls/image/ImageGetRankedImageKeywords }{状态代码:200,标题{
“访问控制允许来源”=“*”;
“缓存控制”=“无缓存”;
连接=“保持活动”;
“内容长度”=326;
“内容类型”=“应用程序/json”;
日期=“2015年6月8日星期一05:59:22 GMT”;
服务器=nginx;
“X-AlchemyAPI-CurrentVersion”=“12.15”;
“X-AlchemyAPI-Error-Msg”=“无法分析:下游问题”;
“X-AlchemyAPI-Key”=[API密钥隐藏];
“X-AlchemyAPI-Params”=“情感=0&knowledgeGraph=0&detectedLanguage=unknown&submitLanguage=detect”;
“X-AlchemyAPI-Status”=错误;
“X-AlchemyAPI-Total-Transactions”=0;
} })
无
不确定出了什么问题,但Alchemy文档确实指出POST请求的“内容类型”标题应设置为“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)
    })

}
@iAction func analyzeImage(发件人:UIButton){
var imageData=UIImagePNGRepresentation(mainImage.image)
//让base64ImageString=imageData.base64EncodedStringWithOptions(.allZeros)
var request=HTTPTask()
request.requestSerializer=HTTPRequestSerializer()
request.requestSerializer.headers[“内容类型”]=“应用程序/x-www-form-urlencoded”
让参数:字典=[
“API键”:API_键,
“imagePostMode”:“原始”,
“图像”:图像数据,
“outputMode”:“json”]
中的request.POST(端点,参数:params,completionHandler:{(响应:HTTPResponse))
println(response.headers)
})
}

但我还是得到了同样不能再分析下游问题的错误

使用imagePostMode raw时,需要将图像数据作为POST请求的主体发送,并且参数应包含在端点URL中(例如endpoint=”http://access.alchemyapi.com/calls/image/ImageGetRankedImageKeywords?apikey=API_KEY&outputMode=json&imagePostMode=raw"). 我没有和斯威夫特合作过,所以我不知道最好的方法,但这和你可能期望的有点不同

下面的代码适合我

    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命令测试图像标记请求,如下所示

 curl --data-binary @your_image.png "https://gateway-a.watsonplatform.net/calls/image/ImageGetRankedImageKeywords?imagePostMode=raw&apikey=d3a529b15ac9ebe550a51006815xxxxxx"

请求的图像文档最多可达1 MB。较大的文档将导致“内容超出大小限制”错误响应您试图发送的图像的大小是多少?如果图像很大,您可能希望发布该文档中提到的原始图像,而不是尝试URI编码并使用GET和查询字符串。在某些系统中,URI的最大长度是2083个字符,在某些系统中甚至是255个字符。@Icaro我的测试图像是156kb@Dijkgraaf啊,我明白了。。。所以编码的字符串可能比URI允许的大。。。我要买一个look@Dijkgraaf我现在正在尝试一个POST请求,但得到一个“无法分析:下游问题”错误。我用更多的细节更新了我原来的问题。有什么想法吗?