首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >冒充客户端将MultiValueMap作为MultiPartFormData发送

冒充客户端将MultiValueMap作为MultiPartFormData发送
EN

Stack Overflow用户
提问于 2022-08-22 21:19:44
回答 1查看 455关注 0票数 1

我正试图将下面的kotlin代码从RestTemplate转换为伪客户端。rest模板代码发送multiValueMap作为请求,其中包含内容类型的标题multipart/form-data,并使用JSON对象作为响应。

RestTemplate代码:

代码语言:javascript
复制
    var headers = HttpHeaders()
    headers.contentType = MediaType.MULTIPART_FORM_DATA
    headers.add("custom-header", "value")
    val body: MultiValueMap<String, Any> = LinkedMultiValueMap()
    body.add("field1", "value1")
    body.add("field2", "value2")
    val requestEntity = HttpEntity(body, headers)
    return restTemplate.postForEntity("https://enmf7tx8y37x.x.pipedream.net/", requestEntity, Object::class.java)

在这种情况下,请求发送如下:

标题:

代码语言:javascript
复制
Host: enmf7tx8y37x.x.pipedream.net
X-Amzn-Trace-Id: Root=1-6303ecb2-19a833a044ab3bf83f74f256
Content-Length: 342
Accept: application/xml, text/xml, application/json, application/*+xml, application/*+json
Content-Type: multipart/form-data;boundary=_MtEGFIF4XK_aOU8QsXstQuCliV1-llj
custom-header: value
X-B3-TraceId: a67561ec329f9a16
X-B3-SpanId: a6cc94e403bfe318
X-B3-ParentSpanId: a67561ec329f9a16
X-B3-Sampled: 1
User-Agent: Apache-HttpClient/4.5.13 (Java/17.0.3)
Accept-Encoding: gzip,deflate

正文:

代码语言:javascript
复制
 --_MtEGFIF4XK_aOU8QsXstQuCliV1-llj
    Content-Disposition: form-data; name="field1"
    Content-Type: text/plain;charset=UTF-8
    Content-Length: 6
    
    value1
    --_MtEGFIF4XK_aOU8QsXstQuCliV1-llj
    Content-Disposition: form-data; name="field2"
    Content-Type: text/plain;charset=UTF-8
    Content-Length: 6
    
    value2
    --_MtEGFIF4XK_aOU8QsXstQuCliV1-llj--

我也试图在假装的客户中这样做:

代码:

代码语言:javascript
复制
/*val headers = HttpHeaders()
    headers.contentType = MediaType.MULTIPART_FORM_DATA
    headers.add("custom-header", "value")*/
    val body: MultiValueMap<String, Any> = LinkedMultiValueMap()
    body.add("field1", "value1")
    body.add("field2", "value2")
    val result = testClient.test("value", body)

冒充客户:

代码语言:javascript
复制
@FeignClient(
  value = "testClient",
  url = "https://enmf7tx8y37x.x.pipedream.net/"
)
interface TestClient {
  @PostMapping(
    consumes = [MediaType.MULTIPART_FORM_DATA_VALUE],
    produces = [MediaType.APPLICATION_JSON_VALUE]
  )
  fun test(
    @RequestHeader(value = "custom-header") customHeader: String,
    @RequestPart("request") request: MultiValueMap<String, Any>
  ): ResponseEntity<Object>

}

标题很好,但在正文中没有显示值。

标题:

代码语言:javascript
复制
Host: enmf7tx8y37x.x.pipedream.net
X-Amzn-Trace-Id: Root=1-6303ef0f-78c869881a5b27d0707eab9e
Content-Length: 17
Accept: application/json
Authorization: Basic aHlwb2xhYjp0ZXN0c211cmY=
Content-Type: multipart/form-data; charset=UTF-8; boundary=182c75dd399
custom-header: value
X-B3-TraceId: 2989eb4f12e3d417
X-B3-SpanId: 23414bcdf365784c
X-B3-ParentSpanId: 2989eb4f12e3d417
X-B3-Sampled: 1
User-Agent: Java/17.0.3

正文:

代码语言:javascript
复制
--182c75dd399--

我不得不将consumes值添加为多部分/表单数据,而不是json,以便为AcceptContent-Type获得正确的头值。

如何使用虚拟客户端填充请求?如果@RequestPart是字符串,则该值将在正文中发送,但任何其他数据类型(如multiValueMap、byteArray等)都不能工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-23 13:31:52

在假装客户端,您不能直接使用MultiValueMap。您必须对字节数组和其余的元数据字段使用MultipartFile数据类型,您需要在方法中将每个元数据字段作为单独的参数。然后,FeignClient将生成与使用RestTemplate时显示的请求相同的请求。

代码语言:javascript
复制
import org.springframework.cloud.openfeign.FeignClient
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.http.MediaType
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.RequestHeader
import org.springframework.web.bind.annotation.RequestPart
import org.springframework.web.multipart.MultipartFile

    @FeignClient(
      value = "testClient",
      url = "https://enmf7tx8y37x.x.pipedream.net/"
    )
    interface TestClient {
      @PostMapping(
        consumes = [MediaType.MULTIPART_FORM_DATA_VALUE],
        produces = [MediaType.APPLICATION_JSON_VALUE]
      )
      fun test(
        @RequestHeader(value = "custom-header") customHeader: String,
        @RequestPart(name = "file") file: MultipartFile,
        @RequestPart(name = "field1") field1: String
      ): ResponseEntity<Object>
    
    }

如何创建MultiPartFile的代码示例:

代码语言:javascript
复制
import org.springframework.mock.web.MockMultipartFile

//val multipartFile: MultipartFile = MockMultipartFile("filename", byteArray)
val multipartFile: MultipartFile = MockMultipartFile("filename", "filename", "content type like application/pdf", byteArray)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73451103

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档