关于带有编码图像的帖子图像的json邮递员问题

Posted

技术标签:

【中文标题】关于带有编码图像的帖子图像的json邮递员问题【英文标题】:json postman issue about post image with it's encode image 【发布时间】:2019-12-26 19:04:41 【问题描述】:

我对邮递员 json 格式有疑问。我想发布一个带有编码图像的图像,以将其存储在 mongodb 实例中。但我收到错误 400。我已将图像附加到 formdata 中,它以 json 格式编码详细信息。但我仍然得到相同的 400 错误重复

模型类

public class Image 

    @Id
    private String id;

    private String userId;

    private byte[] image;    

    private String extension;

    private String text;
 /with getters and setter and constructors

控制器

 @RequestMapping(value = "ocr/v1/upload", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
    public Status doOcr(@RequestBody Image image) throws Exception 
        try 
ByteArrayInputStream bis = new ByteArrayInputStream (Base64.decodeBase64 (image.getImage()));
            Tesseract tesseract = new Tesseract(); // JNA Interface Mapping
            String imageText = tesseract.doOCR(ImageIO.read(bis));
            image.setText(imageText);
            repository.save(image);
            LOGGER.debug("OCR Result = " + imageText);
         catch (Exception e) 
     LOGGER.error("TessearctException while converting/uploading image: ", e);
            throw new TesseractException();
        
        return new Status("success");    

JSON:

       
        "image":   
            "userId": "arun0009",   
            "extension": ".png",    
            "text": "WlgSmI3XGrnq31Uy6Vfnuo/qnHz1K8Z1+e4flJXk"
        
    

代码:

    @Test
    public void testDoOcr() throws IOException 
    
    Map<String, String> headers = new HashMap<String, String>();
    headers.put("Accept", MediaType.APPLICATION_JSON_VALUE);
    headers.put("Content-Type", MediaType.APPLICATION_JSON_VALUE);

        Image image = new Image();
        InputStream inputStream = ClassLoader.getSystemResourceAsStream("eurotext.png");
        image.setUserId("arun0009");
        image.setExtension(".png");
        image.setImage(Base64.encodeBase64(IOUtils.toByteArray(inputStream)));
        String response = given().contentType("application/json").headers(headers).body(image).when().post("http://localhost:8080/ocr/v1/upload").then()
            .statusCode(200).extract().response().body().asString();
        System.out.println(response);
    

“状态”:400, "error": "错误请求", "message": "JSON 解析错误:无法从 START_ARRAY 令牌中反序列化 com.tess4j.rest.model.Image 的实例;嵌套异常是 com.fasterxml.jackson.databind.exc.MismatchedInputException:无法在 START_ARRAY 令牌中反序列化 com.tess4j.rest.model.Image 的实例\n [来源:(PushbackInputStream);行:1,列:1]", "路径": "/ocr/v1/upload"

【问题讨论】:

【参考方案1】:

嗯,我真的认为你的问题在于转换。尝试使用这样的注释来忽略您未在 JSON 中传递的字段:

@JsonIgnore
@JsonProperty(value = "user_password")
public String userPassword;

参考:Ignore fields from Java object dynamically while sending as JSON from Spring MVC。


编辑

您的 Image 类可能有一个“私有字符串 imageReceived”(Base64String)和一个“私有字节 [] 图像”。您可以接收一个字符串并解密为一个字节[]。 HTTP Transactions 只能通过你已经转换的方式传递字符串值,你只需要在 Web API 中接收这个字符串值

【讨论】:

是的,也试过了,但同样的错误重复 您的后端代码是如何工作的?我想这也可能是 json 转换为对象的问题 好吧,我真的认为您的问题在于转换。尝试使用这样的注释来忽略您未在 json 中传递的字段:@JsonIgnore @JsonProperty(value = "user_password") public String userPassword;参考文献:***.com/questions/23101260/… 我将这个@Jsonignore 和JsonProperty 应用于json 转换[postman] 中未使用的字段,但错误仍然存​​在。错误的请求和内部服务器错误。我找不到在邮递员中传递字段的确切方法。我被添加了图像,它在邮递员中编码了详细信息,但它不接受 json 格式。我在这个主题上应用了许多堆栈溢出建议,但不起作用。来源网址:github.com/arun0009/ocr-tess4j-rest 所以由于问题不是一些未映射的字段,您可以使用 base64StringImage 字段例如,因为我认为错误可能与字段类型有关,它必须尝试解析数组并找到一个字符串。

以上是关于关于带有编码图像的帖子图像的json邮递员问题的主要内容,如果未能解决你的问题,请参考以下文章

在邮递员表单数据中发布嵌套的 json

带有图像的 Restkit MultiForm 帖子

邮递员:socket挂断

JSON 解析错误:无法从 START_OBJECT 令牌中反序列化 `byte[]` 的实例

在 NodeJS/Express 中将带有其他键值参数的图像上传到 postman

rails 4 justifiedGallery 脚本仅加载带有图像的最新帖子