Не удается определить тип содержимого в ответе с помощью RestClient - PullRequest
0 голосов
/ 24 мая 2019

Приложение My Grails подключается к другому приложению Grails, которое преобразует файл .pdf в файл .png, если файл .pdf представляет собой одностраничный файл, или .zip из файла .pngs, если файл .pdf содержит несколько страниц. Вот код конвертера:

class PdfToPngController {
    def converterService

    def convert() {
        File originalFile = ...
        File converted = converterService.convert(originalFile, "png")

        InputStream inputStream = converted.newInputStream()

        response.outputStream << inputStream
        response.setContentLength(Long.valueOf(converted.length()).intValue())
        response.setCharacterEncoding("UTF-8")

        String mimeType
        if(converted.endsWith(".png")) {
            mimeType = "image/png"
        }
        else if(converted.endsWith(".zip")) {
            mimeType = "application/zip"
        }

        response.contentType = mimeType
        response.setHeader("Content-type", mimeType)
        response.setContentType(mimeType)

        response.setHeader("Content-disposition", "inline;filename=${converted.getName()}")

        inputStream.close()
    }
}

Мое приложение отправит файл PDF и будет ждать преобразованный файл в качестве ответа, проблема в том, что он возвращает null, когда я пытаюсь получить тип содержимого ответа. Вот RESTClient на мое приложение:

RESTClient client = new RESTClient(grailsApplication.config.report.converter.base)

client.request(Method.POST) { multipartRequest ->
    uri.path = grailsApplication.config.report.converter.path

    // ...    

    response.success = { response, data ->
        if(response.getStatus() == HttpServletResponse.SC_OK) {
            println "getContentType: ${response.getEntity().getContentType()}"
            // This prints
            // getContentType: null

            String extension
            if(response.getEntity().getContentType() == "image/png")) {
                extension = "png"
            }
            else if(response.getEntity().getContentType() == "application/zip")) {
                extension = "zip"
            }

            OutputStream outputStream = new ByteArrayOutputStream()
            response.entity.writeTo(outputStream)

            byte[] byteArray = outputStream.toByteArray()

            digest = md5.digest(byteArray)
            hashedFilename = new BigInteger(1, digest).toString(36)

            FileUtils.writeByteArrayToFile(new File(thumbnailsDir.getAbsolutePath() +
                File.separator + hashedFilename +
                "." + extension), byteArray)

            outputStream.close()
        }
        else if(HttpServletResponse.SC_CREATED) {
            throw new ConnectException("The report service failed to convert it to .png.")
        }
    }
}

Почему мое приложение не может определить contentType ответа? Приложение конвертера устанавливает contentType неправильно? Или я неверно определяю contentType? Или это вина конвертирующего приложения?

...