【问题标题】:Send an image to an OCR API with Rertofit and Kotlin使用 Rertofit 和 Kotlin 将图像发送到 OCR API
【发布时间】:2022-12-17 07:19:29
【问题描述】:

我正在尝试使用https://api-ninjas.com/api/imagetotext 发送图像以从中提取文本。尽管如此,我仍然收到 HTTP 400 错误并且无法弄清楚原因!我的资产文件夹中有一张图片,我应该会收到链接中提到的来自 API 的单词列表。任何关于如何获得适当错误或修复它的提示都会很棒。我的代码是:

data class Word(
    val bounding_box: BoundingBox,
    val text: String
)

data class BoundingBox(
    val x1: Int,
    val x2: Int,
    val y1: Int,
    val y2: Int
)

文件API.kt

import com.example.misinfo.retrofitfileupload.dto.Word
import okhttp3.MultipartBody
import okhttp3.OkHttpClient
import retrofit2.Call
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import retrofit2.http.Multipart
import retrofit2.http.POST
import retrofit2.http.Part

interface FileApi {

    @Multipart
    @POST("/v1/imagetotext")
    suspend fun uploadImage(
        @Part image: MultipartBody.Part,
    ): Call<List<Word>>


    companion object {
        private val client = OkHttpClient.Builder().build()
        val instance by lazy {
            Retrofit.Builder()
                //TODO: add some API url
                .baseUrl("https://api.api-ninjas.com/")
                .client(client) // add a client instance here, e.g. OkHttpClient
                .addConverterFactory(GsonConverterFactory.create())
                .build()
                .create(FileApi::class.java)
        }
    }
}

文件库.kt


import android.util.Log
import com.example.misinfo.retrofitfileupload.dto.Word
import okhttp3.MultipartBody
import java.io.File
import java.io.IOException
import okhttp3.RequestBody.Companion.asRequestBody
import retrofit2.Call
import retrofit2.Callback
import retrofit2.HttpException
import retrofit2.Response

class FileRepository {

    suspend fun uploadImage(file: File): Boolean {
        var res = false
        try {
            FileApi.instance.uploadImage(
                image = MultipartBody.Part
                    .createFormData(
                        "image",
                        file.name,
                        file.asRequestBody()
                    )
            ).enqueue(
                object : Callback<List<Word>> {
                    override fun onFailure(call: Call<List<Word>>, t: Throwable) {
                        Log.e("API Request", "I got an error and i don't know why :(")
                    }
                    override fun onResponse( call: Call<List<Word>>, response: Response<List<Word>>) {
                        val responseBody = response.body()
                        Log.e("API Request", responseBody.toString())
                    }
                }
            )
            res = true
            return res
        } catch (e: IOException) {
            e.printStackTrace()
            return res
        } catch (e: HttpException) {
            e.printStackTrace()
            return res
        } finally {
            Log.e("API Request", res.toString())
        }
    }
}

文件视图模型.kt

import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.example.misinfo.retrofitfileupload.FileRepository
import kotlinx.coroutines.launch
import java.io.File

class FileViewModel(
    private val repository: FileRepository= FileRepository()
): ViewModel() {
    fun uploadImage(file: File){
        viewModelScope.launch {
            repository.uploadImage(file)
        }
    }

}

MainActivity.kt

class MainActivity : ComponentActivity() {

    class MyReceiver : BroadcastReceiver() {
        override fun onReceive(context: Context?, intent: Intent?) {
            println("Clicked on Pip Action")
        }
    }

    private val isPipSupported by lazy {
        packageManager.hasSystemFeature(
            PackageManager.FEATURE_PICTURE_IN_PICTURE
        )
    }

    private var viewBounds = Rect()

    @RequiresApi(Build.VERSION_CODES.O)
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            MisInfoTheme {
                //ApplicationSwitcher()
                val viewModel = viewModel<FileViewModel>()
                Box(
                    modifier = Modifier.fillMaxSize(),
                    contentAlignment = Alignment.Center
                ) {
                    Button(onClick = {
                        val file = File(cacheDir, "img.png")
                        file.createNewFile()
                        file.outputStream().use {
                            assets.open("img.png").copyTo(it)
                        }
                        viewModel.uploadImage(file)
                    }) {
                        Text(text = "Upload image")
                    }
                }
            }
        }
    }
}

【问题讨论】:

    标签: java android kotlin retrofit android-jetpack-compose


    【解决方案1】:

    HTTP 400 Bad Request 所以我猜这里的问题是因为你试图用错误的路径发送,正如你在这里看到的那样你设置你的 POST 端点错误它不应该以“/”开头删除它并且它应该可以正常工作我猜

    @Multipart
        @POST("v1/imagetotext")
        suspend fun uploadImage(
            @Part image: MultipartBody.Part,
        ): Call<List<Word>>
    

    【讨论】:

      猜你喜欢
      • 2019-09-15
      • 2021-09-13
      • 1970-01-01
      • 2022-01-25
      • 1970-01-01
      • 1970-01-01
      • 2014-04-09
      • 2020-09-03
      • 2017-12-04
      相关资源
      最近更新 更多