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

Curl/Spring MVC:POST给出MissingServletRequestParameterException

钱繁
2023-03-14

我使用Spring MVC4与@RestController接收表单帖子。我已经按照这里给出的提示做了它,它在Spring TestMockMvc中运行良好。

但是,我现在想用curl将内容发布到我的服务器上,我找不到被接受的方法。我总是得到以下例外:org。springframework。网状物绑定MissingServletRequestParameterException:所需的字符串参数“文件”不存在

我试图混合来自Spring@消耗和来自curl-H选项,但它似乎不相关。

因此,给定以下@RestController,应该执行什么curl命令来发布内容?

@RestController
@RequestMapping(value = ONE_COLLECTION)
public class OneCollectionController {

    @RequestMapping(method = RequestMethod.POST )
    public RESTDocumentListElement uploadDocument( @RequestParam("file") MultipartFile file, @RequestPart("data") NewDocumentData documentData ) throws IOException {
       // -- code here --
    }
}

我尝试的最后一个命令(出现异常):

curl http://host/oneCollection -X POST -F "file=@./myFile.txt" -H "Content-Type: multipart/form-data" -F 'data={"name"="myName"}'

工作Spring测试MockMvc代码:

// ...

MockMultipartFile firstFile = new MockMultipartFile("file", "dummyFile.txt", "text/plain", "blahblah".getBytes());
MockMultipartFile jsonFile = new MockMultipartFile("data", "", "application/json", TestUtil.convertObjectToJsonString(documentData).getBytes() );

ResultActions result = mockMvc.perform(fileUpload(ONE_COLLECTION)
                    .file(firstFile)
                    .file(jsonFile)
    );

// ...

共有1个答案

桂嘉年
2023-03-14

明白了!

我已经更改了控制器方法映射:

 @RequestMapping(method = RequestMethod.POST, consumes = {"multipart/*"})
 public RESTDocumentListElement uploadDocument( @RequestPart("file") MultipartFile file, @RequestPart("data") NewDocumentData documentData ) throws IOException {

但棘手的部分是在我的JavaConfig中的MultipartResolver,我使用的是Servlet 3提供的标准Standard ServletMultipartResolver,并且不得不切换到Apache Commons 1:

@Bean
public MultipartResolver multipartResolver() {
    CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
    return multipartResolver;
}

所以我也需要对maven有一些依赖

<!-- Apache Commons -->
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3</version>
</dependency>

最后,curl命令是:

curl http://host/oneCollection -X POST -F 'file=@./firstFile.txt;type=text/plain' -F 'data={"collection":"toto"};type=application/json' -H "Content-Type: multipart/form-data" 
 类似资料:
  • 我试图通过curl与新闻提供网站进行api集成。我能够检索数据,但它不是json格式,所以很难在我的门户网站上显示该数据。 下面是我使用的代码。 请找个人帮忙 curl.php 下面是我得到的结果,如果我回显从上述代码收到的响应 {“状态”:“好的”,“总计结果”: 36,“文章”:[{“来源”:{“id”: null,“名称”:“Tmz.com”},“作者”:“TMZ工作人员”,“标题”:“90

  • 问题内容: 我最近才升级到OSX 10.10 Yosemite,由于升级,我无法再将Curl POST转换为SSL url。 我首先使用了wordpress的调用,还尝试在php中使用curl。两者(按预期)给出相同的错误消息: 错误号:56 错误字符串:SSLRead()返回错误-9806 注意:当我将POST卷曲到HTTP时,它可以正常工作。我认为这是PHP.ini或apache中的设置(升级

  • 该错误是间歇性的,有时它有效,有时它不起作用,这使得调试非常困难。 机器:视窗 10 框架:拉拉维尔5.1 环境: 家园 2.2.1 Vagrant 1.8.1 (Ubuntu 14.04.2 LTS GNU/Linux 3.13.0-32-generic x86_64) 5.6.10-1 deb.sury.org “咕噜咕噜/咕噜”: 6.1.1, “get-stream/stream-lara

  • 问题内容: 如何隐藏PHP中curl的输出? 我的代码如下: 问题是整个页面都喷出了,我如何简单地显示“成功”或“失败”消息? 问题答案: 使用此选项可以: 这将使返回数据而不是输出数据。 要查看是否成功,您可以再检查也。

  • 我想在php$变量中获取返回值 我现在得到的是这样的 ok true 10007.20 cd3f2d61-c929-4a6e-a587-33878fb2b836 200 虽然我想在变量中得到它: > $value 1='ok'; $value 2='true'; $value 3='10007.20'; Echo html实体($内容); ok true 10005.20 4ce81f05-31c

  • curl 可以通过各种形式的地址传输数据。 选项 curl 命令有很多选项,最小化原则,暂时你只需要认识两个选项。 o(--output),写入到文件 O(--remote-name),写入到文件(用远程文件的名字) 输出 输出地址内容: curl 地址 下载 把地址内容下载到某个文件里: curl -o 文件名 地址 如果想用远程地址是文件,把文件下载下来,文件名使用远程文件的名字,可以这样