【问题标题】:How to send JSON as a Input parameter from one Microservice to another using RestTemplate in Spring Boot如何在 Spring Boot 中使用 RestTemplate 将 JSON 作为输入参数从一个微服务发送到另一个微服务
【发布时间】:2016-11-22 12:16:47
【问题描述】:

我想将 JSON 作为 input 从微服务 M1 发送到微服务 M2。

M1 和 M2 都在不同的机器上。 我是 Spring Boot 新手,

我找到了一些code,但我无法得到它。 请帮忙。

【问题讨论】:

    标签: java spring-boot resttemplate microservices


    【解决方案1】:

    在这两个微服务上创建一个类或将该类创建一个 jar 并添加到两个微服务中,以便它们都可以访问相同的数据。

    假设类是

    class TestData{
     private String name;
     private String id;
    
     // getters and setters
    }
    

    现在您可以将数据从 M1 发送到 M2,如下所示

        RestTemplate restTemplate = new RestTemplate();
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        TestData data = new TestData();
        HttpEntity<?> entity = new HttpEntity<Object>(data,headers);
        ResponseEntity<Object> responseEntity =    restTemplate.exchange("url", HttpMethod.POST, entity, Object.class);
    

    在微服务 M2 中,您可以编写一个控制器来获取数据并按如下方式处理它

    @RequestMapping(value="/url",method=RequestMethod.POST)
    public Object do(@RequestBody TestData data){
      // do something
      return //something
    }
    

    【讨论】:

    • 您好,我实现了与您在上面发布的代码相同的代码。
    • 我面临身份验证失败错误。我需要设置运行 M2 微服务的其他系统的用户名和密码吗?如果是的话如何设置
    • 在这种情况下,您需要提供一种机制来调用微服务以对 m2 进行经过身份验证的调用,以便 m2 可以对调用进行身份验证并执行操作。这实际上取决于您使用的身份验证机制
    • RestTemplate restTemplate= new RestTemplate(); HttpHeaders 标头 = 新的 HttpHeaders(); //headers.add("授权",""); headers.setContentType(MediaType.APPLICATION_JSON);测试数据数据 = 新测试数据(); HttpEntity> entity = new HttpEntity(data,headers); ResponseEntity responseEntity = restTemplate.exchange("10.109.218.178:9090/loadJson", HttpMethod.POST, entity, Object.class);
    • 我的意思是您在 10.109.218.178 的应用程序如何处理身份验证。您可以将此 url 公开以进行测试,然后应用身份验证。如果它基于标题的授权,则在标题的授权字段中传递正确的键值
    【解决方案2】:

    这里是示例代码

    public class Test {
    
        public static void main(String[] args) {
            String jsonString = "{\"id\" : \"123\",\"name\" : \"Tom\",\"class\" : {\"subject\" : \"Math\",\"teacher\" : \"Jack\"}}";
            RestTemplate restTemplate = new RestTemplate();
            String url = "http://192.1168.1.190:8080/test" // url for second service
            System.out.println(responserEntityValue(jsonString,restTemplate,url,HttpMethod.POST,String.class));
        }
    
        public ResponseEntity<String> responserEntityValue(final String body, final RestTemplate restTemplate,
                final String uRL, final HttpMethod requestMethod, final Class<String> stringClass) {
    
            HttpHeaders headers = new HttpHeaders();
            // Set all headers
            headers.add(DatabaseConstants.CONTENT_TYPE, "application/json");
    
            HttpEntity<String> request = new HttpEntity<>(body, headers);
    
            return restTemplate.exchange(uRL, requestMethod, request, stringClass);
    
        }
    

    【讨论】:

      【解决方案3】:

      假设您有 MicroService1,它需要将 JSONObject => JsonObject 发送到另一个位于不同机器但在同一网络上的 MicroService2。

      发送方:

      RestTemplate restTemplate = new RestTemplate();    
      
      String jsonString = restTemplate.postForObject("http://10.177.7.128:8080/user/insertJsonObject",jsonObject,String.class);
      

      restTemplate.postForObject 的语法是:

      ResponseType var1 =   restTemplate.postForObject("network ip Address:portnumber/path",JSONObject,ResponseType)
      

      要了解 URI,请转到系统偏好设置 > 网络

      在接收端接收对象

          @RequestMapping(value="/user/insertJsonObject", method=RequestMethod.POST)
              public String updateProductSold(@RequestBody JSONObject jsonObject) { 
      
      ...Body
      ...
      ...
      
      return responseStatus;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-15
        • 2020-01-10
        • 2021-08-06
        • 1970-01-01
        • 2017-06-12
        • 2018-12-27
        • 2020-04-27
        • 2021-05-24
        相关资源
        最近更新 更多