emazzotta:
Tengo la siguiente firma para mi controlador de carga de archivos Micronaut (en Java):
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces("application/json")
@Post
public Single<IdType> uploadFile(Publisher<CompletedFileUpload> files)
Y tengo la siguiente prueba Spock de trabajo (en Groovy):
@MicronautTest
class UploadSpecification extends Specification implements CsvFileBuilder {
@Inject
@Client('/')
HttpClient client
@Shared
List<String> allowedMimeTypes = List.of("text/csv", "application/vnd.ms-excel")
@Unroll
void "upload mailings csv with content type #mediaType"() {
given:
MultipartBody multipartBody = MultipartBody
.builder()
.addPart("files", "myfile.csv", new MediaType(mediaType), createCsvAsBytes(buildCsv()))
.build()
when:
HttpResponse response = client.toBlocking()
.exchange(POST("/v1/mailings", multipartBody).contentType(MediaType.MULTIPART_FORM_DATA_TYPE))
then:
response.status == HttpStatus.OK
where:
mediaType << allowedMimeTypes
}
}
Lo que me gustaría cambiar de la prueba es: En lugar de utilizar el estándar HttpClient
que se inyecta en la parte superior de la prueba, me gustaría usar algo como esto:
@Inject
UploadClient uploadClient
@Client(value = "/v1/mailings")
static interface UploadClient {
@Post
HttpResponse postFile(...)
}
Mi pregunta es, ¿qué firma, hace el postFile
de la necesidad del cliente? ¿Seguiré siendo capaz de utilizar MultipartBody
pero de alguna manera convertirlo en un CompletedFileUpload
? Realmente no estoy seguro de cómo resolver esto y yo soy un principiante cuando se trata de RxJava
.
Cualquier ayuda es apreciada.
Puneet Behl:
Por favor, intente lo siguiente:
@Client(value ="/v1/upload")
static interface UploadClient {
@Post(uri = "/mailings", produces = MediaType.MULTIPART_FORM_DATA)
HttpResponse postFile(@Body MultipartBody file)
}
Agregar produce y la anotación del cuerpo