Spring Boot REST模板URI编码


在实现微服务或整体应用程序时,最好为Rest模板接口的URI端点进行硬编码是第一参考点。

没有简单的方法可以做到这一点!

URI变量通常用于路径元素,查询字符串参数或在将应用程序与前端解耦时使用。理想情况下,您将找到一种更好的解决方案,以构造您的URI来访问各个端点上的数据。但是,在执行了两次端点命中之后,您可能会遇到一个有趣的错误,例如

org.springframework.web.client.ResourceAccessException: I/O error: http://localhost:8080%api%users

不管进行了哪些研究,URI包都可以很方便地与String Builder一起使用来查询API。有几种方法可以实现此目的:

StringBuilder builder = new StringBuilder("http://localhost:8080/api/users");
URI uri = URI.create(builder.toString());

List<Users> updatedUsers = restTemplate.getForObject(uri, List.class);

这将在Rest模板中返回有关GET请求的用户列表。如果您使用的是POST请求,则将参数附加到字符串生成器中,如下面的代码片段所示:

StringBuilder builder = new StringBuilder("http://localhost:8080/api/adduser");
        builder.append("?username=");
builder.append(URLEncoder.encode("john@1.com",StandardCharsets.UTF_8.toString()));
        builder.append("&password=");
        builder.append(URLEncoder.encode("P@$$word",StandardCharsets.UTF_8.toString()));
        builder.append("&phone=");
        builder.append(URLEncoder.encode("911",StandardCharsets.UTF_8.toString()));

    URI uri = URI.create(urlencoded);

restTemplate.postForObject(uri, Users.class);

如果使用特殊字符,则可能要在特定字符集上使用URL编码器。在这种情况下,我们使用的是UTF_8。仅提交硬编码的URL或Rest模板的行为,这是一个巨大的问号。

或最简单的方法是只在POST查询的硬编码URI上提交一个对象。

@RequestMapping(value = "/addNewUser", method = RequestMethod.POST)
2
    public ModelAndView processRequest(HttpServletRequest request, HttpSession session, @RequestParam("username")String username, @RequestParam("password")String password, @RequestParam("phone")String phone) {

        RestTemplate restTemplate = new RestTemplate();

        Users user = new Users();
        user.setUsername(username);
        user.setPassword(password);
        user.setPhone(phone);
        user.setEnabled(true);

        restTemplate.postForObject("http://localhost:8080/api/adduser", user, Users.class);

        StringBuilder builder = new StringBuilder("http://localhost:8080/api/users");

        URI uri = URI.create(builder.toString());

        List<Users> updatedUsers = restTemplate.getForObject(uri, List.class);

        session = request.getSession(false);
        ModelAndView model = new ModelAndView();

        if(session != null){
            model.setViewName("welcome");

            model.addObject("users", updatedUsers);
            model.addObject("user", (Users)session.getAttribute("user"));
            model.addObject("sessiontracker", sessiontracker.getList());
            model.addObject("sumValidSessions", sessiontracker.getSizeSessionList());

            return model;
        }
        return new ModelAndView("login");
    }

我正在使用的GUI示例添加了一个用户,并将其显示在用户表中。

interface.jpg

因此,这完全取决于您所使用的Spring版本。如果您使用的是旧版的Spring,则UriComponentsBuilder不会在spring-web jar中包含。有关标准URI和编码的更多信息,请单击以下链接:Java URL Encoding。

使用Rest模板深入研究URI可能会变得非常复杂。尽管如此,我还是建议您将其用于整体应用程序,或者如果您想要围绕微服务数据的快速指标GUI。不要忽略Spring允许您开发两种Controller类型,一个标准的MVC Controller和一个Rest Controller,它们为您提供了公开API的功能。

尽管如此,在微服务环境中使用HTTP客户端进行URL上的B2B通信还是很有利的,这增加了围绕异常和响应代码的更多自定义。


原文链接:http://codingdict.com