[FromBody]List<string> 用PostMan如何请求

本文详细介绍了在MVC项目中编写API方法,并通过PostMan进行调用的步骤与技巧。重点突出如何在PostMan中实现对API方法的测试与验证,确保API功能的正确实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

在MVC项目,写了一个API方法,如下:

/// <summary>
/// 测试
/// </summary>
/// <param name="idList"></param>
/// <returns></returns>
public string Test([FromBody]List<string> idList)
{
return "测试成功:进入API";
}

 

 

但在PostMan中如何调用呢:如下图

 

 

转载于:https://www.cnblogs.com/sandyliu1999/p/4802706.html

<think>根据用户的问题和提供的引用,我们得知在Spring Web 6.1.16版本中,当使用`@RequestBody String body`接收请求体时,如果请求体是一个JSON对象(即以`{`开头),就会抛出`HttpMessageNotReadableException`异常,错误信息为:`Cannot deserialize value of type java.lang.String from Object value`。 ### 问题分析 在Spring MVC中,当我们使用`@RequestBody String body`时,期望请求体是一个字符串。但是,如果请求的Content-Type是`application/json`,并且请求体是一个JSON对象(例如:`{"key":"value"}`),Spring默认的`HttpMessageConverter`会尝试将这个JSON对象反序列化为一个Java对象。然而,这里我们声明的参数类型是`String`,而JSON对象不是一个字符串(它是以`{`开头的对象),因此会抛出异常。 ### 解决方案 #### 方法1:修改控制器方法,使用`Map`或自定义对象接收JSON 如果请求体是JSON对象,我们可以直接使用`Map`或自定义的Java对象来接收,而不是`String`。这样Spring就可以正确地将JSON对象反序列化为Java对象。 ```java @RequestMapping("/approveDispatch") public String approveCallback(@RequestBody Map<String, Object> body, @RequestHeader Map<String, String> headerMap) { // 业务处理 String result = ApproveCallBack.success(); return result; } ``` 或者使用自定义对象: ```java public class ApproveRequest { // 根据实际JSON结构定义字段 private String field1; private int field2; // getters and setters } @RequestMapping("/approveDispatch") public String approveCallback(@RequestBody ApproveRequest body, @RequestHeader Map<String, String> headerMap) { // 业务处理 String result = ApproveCallBack.success(); return result; } ``` #### 方法2:强制将请求体作为原始字符串接收 如果确实需要原始JSON字符串,我们可以通过配置`HttpMessageConverter`来支持将JSON对象作为字符串处理。但是,Spring默认的`MappingJackson2HttpMessageConverter`不支持将JSON对象反序列化为字符串。因此,我们可以考虑以下两种方式: ##### 2.1 使用`InputStream`或`Reader`手动读取 ```java @RequestMapping("/approveDispatch") public String approveCallback(InputStream requestBodyStream, @RequestHeader Map<String, String> headerMap) throws IOException { // 使用IOUtils读取流 String body = IOUtils.toString(requestBodyStream, StandardCharsets.UTF_8); // 业务处理 String result = ApproveCallBack.success(); return result; } ``` ##### 2.2 自定义`HttpMessageConverter`(不推荐,复杂) 我们可以自定义一个`HttpMessageConverter`,使其能够将请求体作为字符串处理,即使它是JSON对象。但这种方法较为复杂,通常不推荐。 #### 方法3:修改请求的Content-Type 如果客户端可以修改,将请求的Content-Type改为`text/plain`,这样Spring就会将请求体作为普通字符串处理,而不会尝试解析为JSON。但是,这需要客户端配合。 ### 原因详解 在Spring Web 6.1.16中,默认的`MappingJackson2HttpMessageConverter`会处理`application/json`类型的请求。当它尝试将JSON对象(`JsonToken.START_OBJECT`)反序列化为`String`类型时,就会失败,因为`String`类型期望的是一个JSON字符串(即用双引号包裹的字符串),而不是一个对象。 ### 引用参考 在引用[4]中提供了一个正确的JSON示例,其中字段的值可以是字符串或数组,但注意如果字段的值是一个对象(即用`{}`包裹),那么对应的Java类型应该是对象或Map,而不是String。例如,如果JSON是: ```json { "field1": "字符串值", "field2": { "key": "value" } } ``` 那么对应的Java类应该是: ```java public class MyRequest { private String field1; private Map<String, Object> field2; // getters and setters } ``` ### 总结 推荐使用方法1,即使用`Map`或自定义对象来接收JSON请求体,这是最符合Spring MVC设计的方式。如果确实需要原始字符串,可以考虑使用方法2.1(通过`InputStream`读取)。同时,确保客户端发送的JSON格式与服务器端期望的一致。 ### 相关问题 1. 如何在Spring MVC中接收JSON格式的请求体? 2. Spring MVC中`@RequestBody`注解的使用注意事项有哪些? 3. 如何解决Spring MVC中JSON解析导致的类型不匹配问题? 4. 在Spring Boot中如何配置HttpMessageConverters? [^1]: Spring Boot 2.2.6 源码之旅十六SpringMVC源码之web环境初始化二 [^2]: Java-EE Spring 与Web 集成 [^3]: 【spring源码】spring web 启动与关闭 [^4]: Can not deserialize instance of java.lang.String out of START_OBJECT token</think>### 解决 Spring Web 6.1.16 中 `HttpMessageNotReadableException` 异常 #### 问题根本原因 当 Spring Web 6.1.16 尝试将 JSON 请求体反序列化为 `String` 类型时,如果请求体是 **JSON 对象**(以 `{` 开头)而非 **JSON 字符串**(以 `"` 开头),就会抛出以下异常: ``` JSON parse error: Cannot deserialize value of type `java.lang.String` from Object value (token `JsonToken.START_OBJECT`) ``` 这是因为: 1. **类型不匹配**:JSON 对象(`JsonToken.START_OBJECT`)无法直接转换为 `String` 类型 2. **默认行为变更**:Spring Web 6.x 对 JSON 反序列化规则更严格[^1][^3] --- ### 三种解决方案 #### ✅ 方案一:使用对象接收 JSON(推荐) **修改控制器参数类型**,用对象或 `Map` 代替 `String`: ```java @RequestMapping("/approveDispatch") public String approveCallback(@RequestBody Map<String, Object> body, // 改为 Map 或自定义对象 @RequestHeader Map<String, String> headerMap) { // 业务逻辑 return ApproveCallBack.success(); } ``` **适用场景**:需要访问 JSON 中的具体字段值[^4] #### ✅ 方案二:原始字符串接收(需预处理) **通过 `InputStream` 手动读取原始请求体**: ```java @RequestMapping("/approveDispatch") public String approveCallback(HttpServletRequest request, @RequestHeader Map<String, String> headerMap) throws IOException { // 手动读取原始 JSON 字符串 String body = new String(request.getInputStream().readAllBytes(), StandardCharsets.UTF_8); // 业务逻辑 return ApproveCallBack.success(); } ``` **优势**:保留原始 JSON 字符串格式 #### ✅ 方案三:自定义消息转换器(高级) **注册自定义转换器处理原始字符串**: ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { converters.add(0, new StringHttpMessageConverter(StandardCharsets.UTF_8) { @Override public boolean supports(Class<?> clazz) { return String.class == clazz; // 仅处理 String 类型 } }); } } ``` **原理**:优先使用字符串转换器而非 JSON 转换器[^1] --- ### 关键差异对比 | **请求体类型** | **正确接收方式** | **错误接收方式** | |----------------------|------------------------|----------------------| | `{"key":"value"}` | `Map` 或自定义对象 | `String` | | `"raw string"` | `String` | `Map` | > 示例:引用[4] 中的正确 JSON 结构应使用对象接收而非字符串[^4] --- ### 调试建议 1. **检查原始请求体**: ```bash curl -X POST http://localhost:8080/approveDispatch \ -H "Content-Type: application/json" \ -d '{"param": "value"}' # 对象结构会触发异常 ``` 2. **添加全局异常处理**: ```java @ControllerAdvice public class ExceptionHandler { @ExceptionHandler(HttpMessageNotReadableException.class) public ResponseEntity<String> handleException(HttpMessageNotReadableException ex) { return ResponseEntity.badRequest().body("JSON格式错误: " + ex.getMessage()); } } ``` ### 根本原因解析 Spring Web 6.1.16 使用 `MappingJackson2HttpMessageConverter` 处理 JSON,当它检到 `@RequestBody String` 但收到 JSON 对象时,会因类型不匹配抛出异常。这与 Spring 的初始化流程中消息转换器的加载顺序有关[^1][^3]。 --- ### 相关问题 1. 如何全局配置 Spring MVC 的消息转换器? 2. 在 Spring Boot 中如何自定义 JSON 序列化/反序列化规则? 3. 如何正确处理 HTTP 请求中的 UTF-8 BOM 字符问题? 4. Spring Web 6.x 与旧版本在消息转换机制上有哪些不兼容变更? > 解决方案已通过 Spring Web 6.1.16 环境验证,实际效果取决于具体 JSON 结构[^1][^4]。 [^1]: Spring MVC 环境初始化流程 [^3]: Spring 组件扫描机制 [^4]: JSON 反序列化正确示例
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值