【问题标题】:How to get an image file from an API using Rest Template如何使用 Rest Template 从 API 获取图像文件
【发布时间】:2020-12-11 18:09:42
【问题描述】:

我有一个第三方 API,它以 png 格式返回图像作为响应。我正在使用 Rest 模板调用该 API 并以 Byte[] 获取响应,但我遇到了这个异常

There was an unexpected error (type=Bad Request, status=400).JSON parse error: Can not deserialize instance of java.lang.Byte[] out of START_OBJECT token; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.lang.Byte[] out of START_OBJECT token at [Source: java.io.PushbackInputStream@7c9dac50; line: 1, column: 1]

我已经编写了以下代码来使用其余模板获取图像

HttpHeaders headers = new HttpHeaders();
headers.add("Accept", "*/*");
headers.set("Authorization","Bearer "+bearerToken);
headers.setAccept(Arrays.asList(MediaType.APPLICATION_OCTET_STREAM));
HttpEntity<String> entity = new HttpEntity<String>(headers);
ResponseEntity<Byte[]> response = restTemplate.exchange(endPoint,HttpMethod.GET,entity,Byte[].class);

如何使用 java 中的 rest 模板从 API 中获取图像?

【问题讨论】:

    标签: java spring-boot spring-mvc


    【解决方案1】:

    你可以试试这个吗?

    ImageModel.java

    import javax.persistence.*;
    @Entity
    @Table(name = "image_table")
    public class ImageModel {
        public ImageModel() {
            super();
        }
        public ImageModel(String name, String type, byte[] picByte) {
            this.name = name;
            this.type = type;
            this.picByte = picByte;
        }
        @Id
        @Column(name = "id")
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
        @Column(name = "name")
        private String name;
        @Column(name = "type")
        private String type;
        //image bytes can have large lengths so we specify a value
        //which is more than the default length for picByte column
        @Column(name = "picByte", length = 1000)
        private byte[] picByte;
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getType() {
            return type;
        }
        public void setType(String type) {
            this.type = type;
        }
        public byte[] getPicByte() {
            return picByte;
        }
        public void setPicByte(byte[] picByte) {
            this.picByte = picByte;
        }
    }
    

    ImageRepository.java

        import java.util.Optional;
        import org.springframework.data.jpa.repository.JpaRepository;
        import com.javainuse.model.ImageModel;
        public interface ImageRepository extends JpaRepository<ImageModel, Long> {
            Optional<ImageModel> findByName(String name);
        }
    
    

    ImageUploadController.java

    
    @RestController
    @RequestMapping(path = "image")
    public class ImageUploadController {
        @Autowired
        ImageRepository imageRepository;
        
        @GetMapping(path = { "/get/{imageName}" })
        public ImageModel getImage(@PathVariable("imageName") String imageName) throws IOException {
            final Optional<ImageModel> retrievedImage = imageRepository.findByName(imageName);
            ImageModel img = new ImageModel(retrievedImage.get().getName(), retrievedImage.get().getType(),
                    decompressBytes(retrievedImage.get().getPicByte()));
            return img;
        }
        // compress the image bytes before storing it in the database
        public static byte[] compressBytes(byte[] data) {
            Deflater deflater = new Deflater();
            deflater.setInput(data);
            deflater.finish();
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream(data.length);
            byte[] buffer = new byte[1024];
            while (!deflater.finished()) {
                int count = deflater.deflate(buffer);
                outputStream.write(buffer, 0, count);
            }
            try {
                outputStream.close();
            } catch (IOException e) {
            }
            System.out.println("Compressed Image Byte Size - " + outputStream.toByteArray().length);
            return outputStream.toByteArray();
        }
    }
    

    【讨论】:

    • 我必须使用rest模板获取图像并将其保存在数据库中。在服务层使用rest模板获取图像?
    猜你喜欢
    • 2017-10-13
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 2022-11-19
    相关资源
    最近更新 更多