В настоящее время я разрабатываю приложение в Kotlin, которое использует FACE API Azure. Для идентификации лиц на изображениях мне нужно отправить изображение на сервер. Я использую Retrofit 2.7.0 для запросов REST. Всякий раз, когда я гуглю об отправке изображения с модификацией, я сталкиваюсь с аннотацией @Multipart
. Например, здесь или здесь . Ни в одном из вопросов не указано, почему они это делают. Я обнаружил, что Multipart является стандартом для отправки файлов по http.
Однако мне, похоже, это не нужно для моего запроса. Простой подход, кажется, работает просто отлично. Видя, как все остальные, кажется, используют multipart, я, вероятно, что-то упустил. Итак, мой вопрос: зачем мне использовать Multipart поверх простого подхода?
В настоящее время я использую этот подход:
interface FaceAPI {
@Headers(value = ["$CONTENT_TYPE_HEADER: $CONTENT_TYPE_OCTET_STREAM"])
@POST("face/v1.0/detect")
suspend fun detectFace(
@Query("recognitionModel") recognitionModel: String = RECOGNITION_MODEL_2,
@Query("detectionModel") detectionModel: String = DETECTION_MODEL_2,
@Query("returnRecognitionModel") returnRecognitionModel: Boolean = false,
@Query("returnFaceId") returnFaceId: Boolean = true,
@Query("returnFaceLandmarks") returnFaceLandmarks: Boolean = false,
@Header(HEADER_SUBSCRIPTION_KEY) subscriptionKey: String = SubscriptionKeyProvider.getSubscriptionKey(),
@Body image: RequestBody
): Array<DetectResponse>
}
И затем я называю это какthis:
suspend fun detectFaces(image: InputStream): Array<DetectResponse> {
return withContext(Dispatchers.IO) {
val bytes = image.readAllBytes()
val body = bytes.toRequestBody(CONTENT_TYPE_OCTET_STREAM.toMediaTypeOrNull(), 0, bytes.size)
val faceApi = ApiFactory.createFaceAPI()
faceApi.detectFace(image = body)
}
}
Этот код работает для изображений размером до 6 МБ, которые поддерживает Azure.