英文:
curl to RESTapi specifying queryParam, pathParam and formData
问题
我正在编写一个包含API的RestController,该API应该接受QueryParam、PathParam和FormData作为输入。我将展示给您代码:
@ApiResponses(value = { @ApiResponse(code = 403, message = "禁止访问/请求未经授权"),
@ApiResponse(code = 412, message = "客户端错误"),
@ApiResponse(code = 500, message = "内部服务器错误"),
@ApiResponse(code = 200, message = "请求已接受") })
@ApiOperation(httpMethod = "POST", value = "一些描述", tags = {
"一些标签" }, notes = "一些注释")
@RequestMapping(method = { RequestMethod.POST }, value = { "/foo/bar/{id}" }, produces = {
"application/json" }, consumes = { "application/json" })
public ResponseEntity moveDPO(@PathVariable(value = "id") String id,
@RequestParam(value = "endpoint") @ApiParam(required = true, allowEmptyValue = false, example = "https://endpoint.com") String endpoint,
@RequestPart(value = "json") String json)
正如您所见,这里有三个参数:
- id -> 路径参数
- endpoint -> 查询参数
- json -> formData(它是JSON)
我尝试以以下方式使用curl调用此REST API
curl -d 'json={"key1":"value1", "key2":"value2", ...}' https://mydomain/foo/bar/3541832?endpoint=https://someendpoint.com -H "Authorization: basic dXNlcjpwYXNzd29yZA==" -H "content-type: application/json"
然而,当我尝试时,我得到以下错误:
{"timestamp":"2020-08-20T14:45:36.940+0000","status":500,"error":"内部服务器错误","message":"无法解析多部分servlet请求;嵌套异常是javax.servlet.ServletException:org.apache.tomcat.util.http.fileupload.impl.InvalidContentTypeException:请求不包含multipart/form-data或multipart/mixed流,内容类型头是application/json","path":"/foo/bar/3541832"}
我无法弄清楚如何使其工作。为什么REST API 期望multipart/form-data?这是因为@RequestPart注解吗?
谢谢。
英文:
I'm writing a RestController which contains an API which is supposed to take as input a QueryParam, a PathParam and a FormData. I'll show you the code:
@ApiResponses(value = { @ApiResponse(code = 403, message = "Forbidden/Request Unauthorized"),
@ApiResponse(code = 412, message = "Client Error"),
@ApiResponse(code = 500, message = "Internal server error"),
@ApiResponse(code = 200, message = "Request accepted") })
@ApiOperation(httpMethod = "POST", value = "Some description", tags = {
"some tag" }, notes = "some note")
@RequestMapping(method = { RequestMethod.POST }, value = { "/foo/bar/{id}" }, produces = {
"application/json" }, consumes = { "application/json" })
public ResponseEntity moveDPO(@PathVariable(value = "id") String id,
@RequestParam(value = "endpoint") @ApiParam(required = true, allowEmptyValue = false, example = "https://endpoint.com") String endpoint,
@RequestPart(value = "json") String json)
As you can see, here I have three parameters:
- id -> the path param
- endpoint -> the query param
- json -> the formData (it is a json)
I'm trying to call this RESTapi with curl in this way
curl -d 'json={"key1":"value1", "key2":"value2", ...}' https://mydomain/foo/bar/3541832?endpoint=https://someendpoint.com -H "Authorization: basic dXNlcjpwYXNzd29yZA==" -H "content-type: application/json"
However, when I try, what I get is the following error:
{"timestamp":"2020-08-20T14:45:36.940+0000","status":500,"error":"Internal Server Error","message":"Failed to parse multipart servlet request; nested exception is javax.servlet.ServletException: org.apache.tomcat.util.http.fileupload.impl.InvalidContentTypeException: the request doesn't contain a multipart/form-data or multipart/mixed stream, content type header is application/json","path":"/foo/bar/3541832"}
I cannot figure out how to make it work. Why the RESTapi is expecting a multipart/form-data? It is because of the @RequestPart annotation?
Thank you.
答案1
得分: 0
我解决了。基本上有三个错误:
- 首先,
-d
选项是指请求体。在我的情况下,我想要将数据作为 formData 发送,所以-F
(或--form
)是正确的选项。 - 第二,查询参数没有进行 URL 编码。
- 第三,内容类型必须是
"content-type: multipart/form-data"
。
最终正确的 curl 命令如下:
curl -F 'json={"key1":"value1", "key2":"value2", ...}' https://mydomain/foo/bar/3541832?endpoint=https%3A%2F%2Fsomeendpoint.com -H "Authorization: basic dXNlcjpwYXNzd29yZA==" -H "content-type: multipart/form-data"
英文:
I solved it. Basically, there were three errors:
- First one, the
-d
option refers to the body. In my case, I wanted to send data as formData, so-F
(or--form
) is the correct option - Second, the queryParam was not url-encoded
- Third, the content-type must be
"content-type: multipart/form-data"
The final correct curl is the following:
curl -F 'json={"key1":"value1", "key2":"value2", ...}' https://mydomain/foo/bar/3541832?endpoint=https%3A%2F%2Fsomeendpoint.com -H "Authorization: basic dXNlcjpwYXNzd29yZA==" -H "content-type: multipart/form-data"
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论