【问题标题】:Sending POST request using Spring framework使用 Spring 框架发送 POST 请求
【发布时间】:2018-04-04 13:38:54
【问题描述】:

我有一个 MySql 记录表,其中有一列名为 ConsignmentCode。我想发送一个 HTTP 请求以通过 ConsignmentCode 搜索表。

当我使用 Postman 向 http://localhost:8081/records/consignmentCode 发出 POST 请求时,正文中包含 {consignmentCode: "123456789"},我收到 404 Not Found 错误。有谁知道为什么?

控制器类:

  /**
     * POST request to search by ConsignmentCode
     *
     * /records/consignmentCode
     *
     * Input ex: {consignmentCode: "123456789"}
     * @param params
     * @return
     */

    @CrossOrigin
    @ResponseBody
    @RequestMapping(
            value = "/consignmentCode",
            method = RequestMethod.POST,
            consumes= MediaType.APPLICATION_JSON_VALUE)
    public java.lang.String SearchRecordsByConsignmentCode(@RequestBody String params) {
        System.out.print("this SearchRecordsByConsignmentCode respond happened");
        JSONObject obj = new JSONObject();
        JSONObject jsonObj = new JSONObject(params);
        String likeConsignment= jsonObj.getString("consignmentCode");

        List<record> results=RecordDao.SearchRecordsByConsignmentCode(likeConsignment);
        obj.put("results", results);
        return obj.toString();
    }

道类:

 /**
     * Search by ConsignmentCode.
     *
     * @param consignmentCode
     * @return
     */

    public List<record> SearchRecordsByConsignmentCode(String consignmentCode) {
        final String sql = "SELECT * FROM records WHERE ConsignmentCode = ?";
        List<record> Record = jdbcTemplate.query(sql, new RowMapper<record>() {
            public record mapRow(ResultSet resultSet, int Id) throws SQLException {
                record records = new record();
                records.setId(resultSet.getInt("Id"));
                records.setNumber(resultSet.getString("Number"));
                records.setTitle(resultSet.getString("Title"));
                records.setScheduleId(resultSet.getInt("ScheduleId"));
                records.setTypeId(resultSet.getInt("TypeId"));
                records.setConsignmentCode(resultSet.getString("ConsignmentCode"));
                records.setStateId(resultSet.getInt("StateId"));
                records.setContainerId(resultSet.getInt("ContainerId"));
                records.setLocationId(resultSet.getInt("LocationId"));
                records.setCreatedAt(resultSet.getDate("CreatedAt"));
                records.setUpdatedAt(resultSet.getDate("UpdatedAt"));
                records.setClosedAt(resultSet.getDate("ClosedAt"));
                System.out.print(records);
                return records;
            }
        }, consignmentCode);
        return Record;
    }

【问题讨论】:

  • 好吧,你的 DAO 类可能与错误无关。你应该在Spring的DispatcherServlet中下一个断点,看看错误在哪里调试doService方法。

标签: mysql spring rest spring-mvc


【解决方案1】:

使用:

@RequestBody String consignmentCode

代替:

@RequestBody String params

【讨论】:

    【解决方案2】:

    您不必期望收到一个字符串然后解析为 JSon。它是 Spring MVC 中的内置行为。

    只需导入杰克逊依赖项。如果您使用 Maven,请添加您的 pom.xml 依赖项:

    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
        <version>1.9.9</version>
    </dependency>
    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-core-asl</artifactId>
        <version>1.9.9</version>
    </dependency>
    

    然后以这种方式更改您的控制器:

    @Controller
    public class RestController {
    
        @ResponseBody
        @RequestMapping(
                value = "/consignmentCode",
                method = RequestMethod.POST,
                consumes= MediaType.APPLICATION_JSON_VALUE)
        public List<Record> SearchRecordsByConsignmentCode(@RequestBody ConsignmentCode code) {
            System.out.print("this SearchRecordsByConsignmentCode respond happened");
    
            List<Record> results=RecordDao.SearchRecordsByConsignmentCode(code.getConsignmentCode());
            return results;
        }
    

    您需要创建一个封装消息正文的类:

    import java.io.Serializable;
    
    public class ConsignmentCode implements Serializable {
    
        private String consignmentCode;
    
        public String getConsignmentCode() {
            return consignmentCode;
        }
    
        public void setConsignmentCode(String consignmentCode) {
            this.consignmentCode = consignmentCode;
        }   
    
    
    }
    

    然后,启动它并尝试将这条消息发布到您的控制器 url(请记住将 Accept/Content-Type 标头设置为 application/json)。属性名称也必须放在分号之间,就是这样:

    {"consignmentCode":"123456789"}
    

    你会得到正确的json格式的结果

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-29
      • 2019-07-07
      • 2013-03-20
      • 2013-09-24
      • 2013-10-06
      • 2015-02-28
      • 2017-02-13
      • 2021-11-30
      相关资源
      最近更新 更多