Feign HATEOS 响应包含错误的服务器、端口信息

阿努普·哈利玛拉

我正在研究 Spring Cloud 并使用 Josh Long 的示例项目

Josh Long 的 Bootiful 微服务

有一个 API 网关预订客户端,它使用来自服务预订服务的数据,该服务提供 HATEOAS 响应,然后将其转换为简单的 JSON 响应。

@RestController
@RequestMapping("/reservations")
class ReservationApiGateway {

方法:

@HystrixCommand(fallbackMethod = "fallback")
@RequestMapping(method = RequestMethod.GET, value = "/names")
public Collection<String> names() {
    return this.reservationReader
            .read()
            .getContent()
            .stream()
            .map(Reservation::getReservationName)
            .collect(Collectors.toList());
}

我修改它以将 HATEOAS 响应转发给我。

@HystrixCommand(fallbackMethod = "fallback")
@RequestMapping(method = RequestMethod.GET, value = "/names")
public Resources<Resource<Reservation>> names() {
    return this.reservationReader
            .read();
}

这给了我一个 HATEAOS 响应,但链接全部来自预订服务- 。

  "_links" : {

    "self" : {

      "href" : "**http://192.168.0.3:7000/reservations/1**"

    },

    "reservation" : {

      "href" : "http://192.168.0.3:7000/reservations/1"

    }

  }

如何确保 Feign 更新到 API 网关的服务器和端口的链接?- http://192.168.0.3:9999/reservations/1

来自预订客户端的相同响应(与预订服务相同):

{

  "_embedded" : {

    "reservations" : [ {

      "reservationName" : "Josh",

      "_links" : {

        "self" : {

          "href" : "http://192.168.0.3:7000/reservations/1"

        },

        "reservation" : {

          "href" : "http://192.168.0.3:7000/reservations/1"

        }

      }

    }, {

      "reservationName" : "Dr. Johnson",

      "_links" : {

        "self" : {

          "href" : "http://192.168.0.3:7000/reservations/2"

        },

        "reservation" : {

          "href" : "http://192.168.0.3:7000/reservations/2"

        }

      }

    }, {

      "reservationName" : "Dr. Syer",

      "_links" : {

        "self" : {

          "href" : "http://192.168.0.3:7000/reservations/3"

        },

        "reservation" : {

          "href" : "http://192.168.0.3:7000/reservations/3"

        }

      }

    }, {

      "reservationName" : "Dr. Pollack",

      "_links" : {

        "self" : {

          "href" : "http://192.168.0.3:7000/reservations/4"

        },

        "reservation" : {

          "href" : "http://192.168.0.3:7000/reservations/4"

        }

      }

    } ]

  },

  "_links" : {

    "self" : {

      "href" : "http://192.168.0.3:7000/reservations{?page,size,sort}",

      "templated" : true

    },

    "profile" : {

      "href" : "http://192.168.0.3:7000/profile/reservations"

    },

    "search" : {

      "href" : "http://192.168.0.3:7000/reservations/search"

    }

  }

}
阿努普·哈利玛拉

我想到了。

解决方案是在 X-Forwarded-Host http 标头中。X-Forwarded-Host 本质上告诉 Spring,任何具有此标头、链接中的主机和端口信息的 HATEOS 响应都应更新为 X-Forwarded-Host http 标头中提到的内容。

因此,在 API Gateway 预订客户端代码中,我添加了这个片段,它拦截了 Feign 对后端服务预订服务的调用,并将 http 标头添加到请求中。

@Component
class LanguageRequestInterceptor implements RequestInterceptor {
    private static final String X_FORWARDED_HOST = "X-Forwarded-Host";

    @Override
    public void apply(RequestTemplate requestTemplate) {
        ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        if (requestAttributes == null) {
            return;
        }
        HttpServletRequest request = requestAttributes.getRequest();
        if (request == null) {
            return;
        }

        requestTemplate.header(X_FORWARDED_HOST, "localhost:9999");
    }
}

现在,所有 HATOES 响应都具有 API 网关的主机和端口信息,而不是后端 HATEOS 服务。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Netflix Feign:404上的ErrorDecoder中的响应正文为空

来自分类Dev

Netflix Feign-通过微服务传播状态和例外

来自分类Dev

feign.FeignException:在微服务调用中读取状态404

来自分类Dev

Spring Cloud Open Feign:ByteArrayResource 的解码器

来自分类Dev

使用 Eureka 时,是否可以使用功能区(通过 feign)定义静态服务器列表?

来自分类Dev

Spring cloud Feign:找不到适合响应类型的HttpMessageConverter [class org.springframework.web.servlet.ModelAndView]

来自分类Dev

Feign Client GET请求,从微服务抛出“方法不允许:请求方法'POST'不受支持”

来自分类Dev

Feign + Consul:只启用发现(客户端),不启用注册(服务)

来自分类Dev

获取标题feign netflix

来自分类Dev

在Feign中使用@RequestLine

来自分类Dev

openfeign 和 feign 的区别

来自分类Dev

如何在Spring Hateos中编写ResourceAssembler的模拟测试用例?

来自分类Dev

如何在Spring Hateos中编写ResourceAssembler的模拟测试用例?

来自分类Dev

获取错误信息;加载资源失败:服务器响应状态为 500

来自分类Dev

文件服务器错误响应

来自分类Dev

使用SSH.NET连接到端口990上的FTP站点时,“服务器响应包含空字符”

来自分类Dev

Django Rest框架-如果表包含响应中的数据,显示服务器错误(500)

来自分类Dev

Django Rest框架-如果表包含响应中的数据,显示服务器错误(500)

来自分类Dev

Openstack neutron:未从响应中的开放堆栈 neutron api 获取端口信息

来自分类Dev

java.lang.IllegalStateException:未定义用于loadBalancing的Feign客户端。您是否忘了包含spring-cloud-starter-netflix-ribbon?

来自分类Dev

检索libvirt域的串行端口信息?

来自分类Dev

如何获取Midi消息端口信息

来自分类Dev

尝试使用 Spring HATEOS 链接到 JPA 存储库查询方法并获取 IllegalArgumentException:'uriTemplate' 不能为空

来自分类Dev

Tomcat服务器错误-端口8080已在使用中

来自分类Dev

Wamp服务器无法绑定到端口80错误

来自分类Dev

服务器套接字的IP和端口错误

来自分类Dev

使用Eureka / Feign时@DataJpaTest失败

来自分类Dev

Feign 客户端和 Redis

来自分类Dev

不同的执行器(管理服务器)端口更改HTTP响应

Related 相关文章

  1. 1

    Netflix Feign:404上的ErrorDecoder中的响应正文为空

  2. 2

    Netflix Feign-通过微服务传播状态和例外

  3. 3

    feign.FeignException:在微服务调用中读取状态404

  4. 4

    Spring Cloud Open Feign:ByteArrayResource 的解码器

  5. 5

    使用 Eureka 时,是否可以使用功能区(通过 feign)定义静态服务器列表?

  6. 6

    Spring cloud Feign:找不到适合响应类型的HttpMessageConverter [class org.springframework.web.servlet.ModelAndView]

  7. 7

    Feign Client GET请求,从微服务抛出“方法不允许:请求方法'POST'不受支持”

  8. 8

    Feign + Consul:只启用发现(客户端),不启用注册(服务)

  9. 9

    获取标题feign netflix

  10. 10

    在Feign中使用@RequestLine

  11. 11

    openfeign 和 feign 的区别

  12. 12

    如何在Spring Hateos中编写ResourceAssembler的模拟测试用例?

  13. 13

    如何在Spring Hateos中编写ResourceAssembler的模拟测试用例?

  14. 14

    获取错误信息;加载资源失败:服务器响应状态为 500

  15. 15

    文件服务器错误响应

  16. 16

    使用SSH.NET连接到端口990上的FTP站点时,“服务器响应包含空字符”

  17. 17

    Django Rest框架-如果表包含响应中的数据,显示服务器错误(500)

  18. 18

    Django Rest框架-如果表包含响应中的数据,显示服务器错误(500)

  19. 19

    Openstack neutron:未从响应中的开放堆栈 neutron api 获取端口信息

  20. 20

    java.lang.IllegalStateException:未定义用于loadBalancing的Feign客户端。您是否忘了包含spring-cloud-starter-netflix-ribbon?

  21. 21

    检索libvirt域的串行端口信息?

  22. 22

    如何获取Midi消息端口信息

  23. 23

    尝试使用 Spring HATEOS 链接到 JPA 存储库查询方法并获取 IllegalArgumentException:'uriTemplate' 不能为空

  24. 24

    Tomcat服务器错误-端口8080已在使用中

  25. 25

    Wamp服务器无法绑定到端口80错误

  26. 26

    服务器套接字的IP和端口错误

  27. 27

    使用Eureka / Feign时@DataJpaTest失败

  28. 28

    Feign 客户端和 Redis

  29. 29

    不同的执行器(管理服务器)端口更改HTTP响应

热门标签

归档