2015-06-08 5 views
7

मैं कीमिया-API दस्तावेज़ यहाँ के माध्यम से पढ़ रहा हूँ:यूआरआई-एनकोड छवि कैसे करें?

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

वे कहते हैं कि छवि यूआरआई-एन्कोड किया जाना चाहिए ... कि वास्तव में क्या मतलब है?

क्या इसका मतलब है कि छवि को बेस 64 स्ट्रिंग में परिवर्तित करना और फिर अनुरोध को पास करना?

मैंने कोशिश की है लेकिन मुझे http 414 त्रुटि प्राप्त है - अनुरोध यूआरआई बहुत बड़ा है।

@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 की सिफारिश में ले गया एक पोस्ट अनुरोध का उपयोग करने के बजाय यूआरआई लंबाई के आसपास काम करने के लिए मिल। मैं ऐसा करने के लिए अलामोफायर लाइब्रेरी का उपयोग कर रहा हूं। त्रुटि जब मैं इस प्रयास करें:

@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 

सुनिश्चित नहीं हैं कि क्या गलत हो रहा है, लेकिन कीमिया प्रलेखन करता राज्य पोस्ट अनुरोध "सामग्री प्रकार" होना चाहिए कि शीर्ष लेख सेट करने के लिए "application/x-: www

यहाँ कंसोल आउटपुट है -फॉर्म-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) 
    }) 

} 

लेकिन मैं अभी भी एक ही फिर से नहीं-विश्लेषण कर सकते हैं नीचे की ओर मुद्दा त्रुटि मिलती है।

+2

"अनुरोधित छवि दस्तावेज़ अधिकतम 1 मेगाबाइट हो सकते हैं। बड़े दस्तावेज़ों के परिणामस्वरूप" सामग्री-सीमा-आकार-सीमा "त्रुटि प्रतिक्रिया होगी।" आप जिस छवि को भेजने की कोशिश कर रहे हैं उसका आकार क्या है? – Icaro

+0

यदि छवि बड़ी है तो आप शायद यूआरआई एन्कोड को आजमाने और क्वेरीस्ट्रिंग के साथ जीईटी का उपयोग करने के बजाय उस दस्तावेज़ में उल्लिखित कच्ची छवि पोस्ट करना चाहेंगे। एक यूआरआई अधिकतम लंबाई 2,083 वर्ण कुछ सिस्टम है, और यहां तक ​​कि 255 वर्ण कुछ अन्य हैं। – Dijkgraaf

+0

@Icaro मेरी टेस्ट छवि 156kb – snowflakekiller

उत्तर

5

छविपोस्टमोड कच्चे का उपयोग करते समय, आपको छवि डेटा को POST अनुरोध के शरीर के रूप में भेजने की आवश्यकता होती है, और पैरामीटर को एंडपॉइंट यूआरएल में शामिल किया जाना चाहिए (उदाहरण के लिए ENDPOINT = "http://access.alchemyapi.com/ कॉल/छवि/ImageGetRankedImageKeywords? apikey = API_KEY & outputMode = json & imagePostMode = raw ")। मैंने स्विफ्ट के साथ काम नहीं किया है, इसलिए मुझे ऐसा करने का सबसे अच्छा तरीका नहीं पता है, लेकिन यह अपेक्षाकृत थोड़ा अलग है कि आप क्या उम्मीद कर सकते हैं।

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 --data-binary @your_image.png "https://gateway-a.watsonplatform.net/calls/image/ImageGetRankedImageKeywords?imagePostMode=raw&apikey=d3a529b15ac9ebe550a51006815xxxxxx" 
संबंधित मुद्दे