当前位置: 首页 > 知识库问答 >
问题:

SpringAPI请求出现“内容类型”应用程序/八位字节流“不受支持”错误,但使用Postman时请求成功

笪烨
2023-03-14

我正试图通过React前端向Spring后端发送一个API请求。当我发送请求时,我收到以下错误:

Could not resolve parameter [0] in private org.springframework.http.ResponseEntity com.example.bottlecap.controllers.BottlecapController.entryForm(com.example.bottlecap.domian.Bottlecap,org.springframework.web.multipart.MultipartFile): Content type 'application/octet-stream' not supported

然而,当我使用邮递员设置请求时,它会顺利通过。我想在React端如何设置FormData可能会有问题。然而,我几乎没有运气弄明白这一点。

我的API应该接收一个对象,该对象包含关于我提交的数据以及与提交相关的图像。在我的Postman请求中,我创建了一个表单数据,其中包含一个JSON文件,该文件包含所有对象数据和一个随机图像,仅用于测试。正如我所说的,这个需求很好。然而,在前端代码中,我将对象数据解析为Json,并将其添加到FormData以及将图像添加到FormData。

这是我的Spring控制器:

@RequestMapping(path ="/bottlecap/entry", method = RequestMethod.POST, consumes = {MediaType.MULTIPART_FORM_DATA_VALUE, MediaType.APPLICATION_OCTET_STREAM_VALUE})
    private ResponseEntity entryForm(@RequestPart("cap") Bottlecap cap, @RequestPart("file") MultipartFile image){
        System.out.println(cap);
        cap.toString();
        System.out.println("Test");
        return ResponseEntity.ok().build();

    }

这是我的反应前端表单提交处理程序:

handleSubmit = event =>{

        console.log(this.state.page);
        
        console.log(this.state.page);
        event.preventDefault();
        const cap ={
            "name":this.state.name,
            "brand":this.state.brand,
            "yearMade":parseInt(this.state.yearMade),
            "country": this.state.country,
            "description":this.state.description,
            "yearFound":parseInt(this.state.yearFound),
            "isAlcoholic":"true"
        };
        const stringCap = JSON.stringify({cap});
        console.log(cap);
        var formData = new FormData();
        formData.append('cap', JSON.parse(stringCap));
        formData.append('file',this.state.imageFile)
        
        
            axios.post('http://localhost:8080/bottlecap/entry', formData, {headers:{'Content-Type':'multipart/form-data'}})
            .then(res=>{
                console.log(res);
                console.log(res.data);
                //window.location = "/success"
                this.setState({pageDone:true})
                this.setState({pageLoading:true})
            })

    }

这是我的邮递员请求的截图,如果可能的话。

这里还有我在Postman上发送的json文件的内容,如果它也有帮助的话。

{"name":"post-test",
"brand":"post-test",
"yearMade":1000,
"country":"post-test",
"description":"post-test",
"yearFound":1000,
"isAlcoholic":"true"}

我做的最后一个更改是向axios API请求添加一个头,但仍然没有成功。

共有1个答案

南门茂才
2023-03-14

在postman中,对于名为cap的参数,您将发送一个。json文件。但在reactjs代码中,您正在

formData.append('cap', JSON.parse(stringCap));

JSON. parse将创建一个javascript对象,这不是您的后端所期望的。您需要将其作为JSON文件发送。

没有测试,但这可能会给你一个想法。

const json = JSON.stringify(cap);
const blob = new Blob([json], {
  type: 'application/json'
});

var formData = new FormData();
formData.append('cap', blob);
formData.append('file', this.state.imageFile)

axios.post('http://localhost:8080/bottlecap/entry', formData, {headers:{'Content-Type':'multipart/form-data'}})
        .then(res=>{
    console.log(res.data);
}
 类似资料:
  • 我正在处理一个API的一部分,它需要调用另一个外部API来检索它的一个函数的数据。调用返回HTTP 500错误,描述为“不支持内容类型‘应用程序/八位字节流’。”该调用应返回“application/json”类型。" 我发现这是因为接收到的响应没有在其头中显式指定内容类型,即使其内容的格式为JSON,所以我的API默认假定它是一个八位字节流。 问题是,我不知道如何适应这种情况。即使另一个API没

  • 我试图发送POST请求。虽然通过POSTMAN发送一切顺利,然后我尝试通过C#代码发送: 我得到了这个错误: 请求包含实体正文,但没有Content-Type标头。此资源不支持推断的媒体类型应用程序/八位流 我怎样才能解决它?

  • 问题内容: 我有一个烧瓶应用程序,具有以下视图: 但是,这仅在请求的内容类型设置为时才有效,否则dict 为None。 我知道请求主体为字符串,但我不想每次客户端忘记设置请求的内容类型时都将其解析为字典。 有没有办法假设每个传入请求的content- type是?我想要的就是始终访问有效的字典,即使客户端忘记将应用程序的内容类型设置为json。 问题答案: 使用并设置为: 从文档中: 默认情况下,

  • 我有一个第三方服务,它用文件向我的Django应用程序发出POST请求。要成功上传到Django应用程序,请求必须具有“多部分/表单数据”内容类型,但在我的案例和请求中,内容类型是“八位流”。文件总是空的。我怎么能在Django中接收八位流内容类型的文件?

  • 我在InteliJ/Java/RestAssured中收到一个400错误的POST请求,但在Postman中没有,所以谁能告诉我哪里出错了,请先告诉Postman 我的身体参数是 现在,当我发布这篇文章时,我得到了200条回复和一个不错的新访问令牌。当我在Java/RestAssured中尝试同样的方法时,我得到一个400错误的请求错误,这就是我发布的内容。 身体 每次运行这个程序,我都会收到HT

  • 我正在获取一条消息,通过gmail API获取完整消息: 我正在传递一条有效的消息。Id号 谷歌。GoogleApiException:“谷歌。API。请求。请求错误 找不到[404] 谷歌。应用程序。请求。请求错误未找到[404]错误[消息[未找到]位置[-]原因[未找到]域[全局]] 这里还有一个问题 有人遇到过这个吗?