我正在尝试实现 Google Vision OCR 请求。这是我的代码,
func performImageRecognition(image: UIImage){
//1. Convert Image into base64 encoding
let imageData: Data = UIImageJPEGRepresentation(image, 1.0)!
let encodedString: String = imageData.base64EncodedString()
//2. Request Body for Vision OCR
let postBody: [String: Any] = getPOSTBody(base64: encodedString)
//3. API Call
AppDelegate.makeRequest(url: Request.url, requestBody: postBody, completionHandler: {
data, response, error in
print(error!)
do{
let dictionary = try JSONSerialization.jsonObject(with: data!, options: [])
print(dictionary)
self.activityindicator.stopAnimating()
}catch{
print("Error Parsing Data: \(error)" )
}
})
}
/*
* Request Body
*/
func getPOSTBody(base64: String) -> [String: Any]{
let json: [String: Any] = [
"requests": [["image": ["content": base64]],
["features": [["type": "TEXT_DETECTION"]]]
]
]
return json
}
请求处理程序
class func makeRequest(url: URL, requestBody: [String: Any],completionHandler: @escaping (Data?, Int?, String?) -> Void){
var requestData: Data!
var urlRequest = URLRequest(url: url, cachePolicy: .reloadIgnoringLocalCacheData, timeoutInterval: 60)
// 1. Serialize the request body to Data
do{
requestData = try JSONSerialization.data(withJSONObject: requestBody, options: [])
}catch{
print("ERROR:: Generating data from JSON Body : \(error) ")
}
// 2. Setting up the required Header Fields
urlRequest.httpBody = requestData
urlRequest.addValue("\(requestData.count)", forHTTPHeaderField: "Content-Length")
urlRequest.addValue("application/json; charset=UTF-8", forHTTPHeaderField: "Content-Type")
urlRequest.httpMethod = "POST"
// 3. Creating the Session
let session = URLSession(configuration: .default)
let dataTask: URLSessionDataTask = session.dataTask(with: urlRequest, completionHandler: {
data, response, error in
if (error != nil){
print("Error is: \(error?.localizedDescription ?? "None")")
return
}
let resp = response as? HTTPURLResponse
DispatchQueue.main.async {
completionHandler(data, resp?.statusCode ?? 0, error?.localizedDescription ?? "None")
}
})
dataTask.resume()
}
出现“错误请求,400 状态,请求必须指定图像和功能”的问题。
我已经检查了 isValidJSONObject 的请求正文,结果为真。 API 在 Postman 上运行良好。
如果我遗漏了什么,请告诉我,我们将不胜感激。
谢谢
最佳答案
您正在为“图像”和“特征”发送不同的数组。
根据文档请求正文应如下所示,
func getPOSTBody(base64: String) -> [String: Any]{
let json: [String: Any] = [
"requests": ["image": ["content": base64],
"features": [["type": "TEXT_DETECTION"]]
]
]
return json
}
关于ios - Google Vision - OCR - 请求必须指定图像和特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46731393/
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这
我正在尝试修改当前依赖于定义为activeresource的gem:s.add_dependency"activeresource","~>3.0"为了让gem与Rails4一起工作,我需要扩展依赖关系以与activeresource的版本3或4一起工作。我不想简单地添加以下内容,因为它可能会在以后引起问题:s.add_dependency"activeresource",">=3.0"有没有办法指定可接受版本的列表?~>3.0还是~>4.0? 最佳答案 根据thedocumentation,如果你想要3到4之间的所有版本,你可以这
我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat
我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden
我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or
这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下
我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的
rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送
我有带有Logo图像的公司模型has_attached_file:logo我用他们的Logo创建了许多公司。现在,我需要添加新样式has_attached_file:logo,:styles=>{:small=>"30x15>",:medium=>"155x85>"}我是否应该重新上传所有旧数据以重新生成新样式?我不这么认为……或者有什么rake任务可以重新生成样式吗? 最佳答案 参见Thumbnail-Generation.如果rake任务不适合你,你应该能够在控制台中使用一个片段来调用重新处理!关于相关公司