Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java WebFlux expand未检索第二个请求_Java_Spring Boot_Spring Webflux_Flux - Fatal编程技术网

Java WebFlux expand未检索第二个请求

Java WebFlux expand未检索第二个请求,java,spring-boot,spring-webflux,flux,Java,Spring Boot,Spring Webflux,Flux,我试图使用Spring的webflux创建一个http端点,以使用github的api流式传输github用户。我试着做了描述的事情,但是扩展似乎没有从github的api获取第二页的结果。我做错了什么? 以下是我目前拥有的代码: @RestController @请求映射(“/user”) 公共类GithBubUserController{ 私有静态最终字符串GITHUB\u API\u URL=”https://api.github.com"; 私有最终WebClient=WebClient

我试图使用Spring的webflux创建一个http端点,以使用github的api流式传输github用户。我试着做了描述的事情,但是扩展似乎没有从github的api获取第二页的结果。我做错了什么? 以下是我目前拥有的代码:

@RestController
@请求映射(“/user”)
公共类GithBubUserController{
私有静态最终字符串GITHUB\u API\u URL=”https://api.github.com";
私有最终WebClient=WebClient.create(GITHUB\u API\u URL);
@GetMapping(value=“/search/stream”,products=MediaType.APPLICATION\u stream\u JSON\u value)
公共流量搜索(
@RequestParam字符串位置,
@RequestParam字符串语言,
@RequestParam(字符串跟随者){
返回用户(
uriBuilder->
uriBuilder
.path(“/search/users”)
queryParam先生(
“q”,
字符串格式(
“位置:%s+语言:%s+追随者:%s”,位置,语言,追随者)
.build())
.扩大(
答复->{
var links=response.headers().header(“link”);
模式p=Pattern.compile(“;rel=\\\”下一个\*”);
用于(字符串链接:链接){
匹配器m=p.Matcher(链接);
如果(m.matches()){
返回client.get().uri(m.group(1)).exchange();
}
}
返回通量.empty();
})
.flatMap(response->response.bodyToFlux(GithubUsersResponse.class))
.flatMap(parsedResponse->Flux.fromIterable(parsedResponse.getItems())
.log();
}
专用用户(函数url){
返回client.get().uri(url.exchange();
}
}
我可以看到第二页的正则表达式是有效的,因为如果我在if中添加打印,它会被打印出来,但是如果我在浏览器或邮递员上进行测试,我只会得到github api返回的第一页结果的结果:

{"login":"chrisbanes","id":"227486"}
{"login":"keyboardsurfer","id":"336005"}
{"login":"lucasr","id":"730395"}
{"login":"hitherejoe","id":"3879281"}
{"login":"StylingAndroid","id":"933874"}
{"login":"rstoyanchev","id":"401908"}
{"login":"RichardWarburton","id":"328174"}
{"login":"slightfoot","id":"906564"}
{"login":"tomwhite","id":"85085"}
{"login":"jstrachan","id":"30140"}
{"login":"wakaleo","id":"55986"}
{"login":"cesarferreira","id":"277426"}
{"login":"kevalpatel2106","id":"20060162"}
{"login":"jodastephen","id":"213212"}
{"login":"caveofprogramming","id":"19751656"}
{"login":"AlmasB","id":"3594742"}
{"login":"scottyab","id":"404105"}
{"login":"makovkastar","id":"1076309"}
{"login":"salaboy","id":"271966"}
{"login":"blundell","id":"655860"}
{"login":"PierfrancescoSoffritti","id":"7457011"}
{"login":"0xddr","id":"4354177"}
{"login":"irsdl","id":"1798313"}
{"login":"andreban","id":"1733592"}
{"login":"TWiStErRob","id":"2906988"}
{"login":"geometer","id":"344328"}
{"login":"neomatrix369","id":"1570917"}
{"login":"nebraslabs","id":"32421477"}
{"login":"lucko","id":"8352868"}
{"login":"isabelcosta","id":"11148726"}

Github API中的
链接
头以转义格式提供URI。传递给
client.get().uri()
的字符串应该是未转义的-因此它将转义转义字符串,最终得到一个不返回任何内容的URL

相反,您可能希望使用类似于:

if (m.matches()) {
    return client.get().uri(URI.create(m.group(1))).exchange();
}
旁注-您的正则表达式可能需要在“下一页”链接之前考虑任意数量的字符,否则您将无法通过第二页,因此您可能需要在
*
前面加上前缀:

Pattern p = Pattern.compile(".*<(.*)>; rel=\"next\".*");
Pattern p=Pattern.compile(“.*;rel=\”下一个\“*”);

第二个注意事项-Github的API是速率限制的(如果您未经身份验证,则会受到严重的速率限制),因此您可能会遇到这些速率限制。您可能希望以某种方式优雅地处理这种情况,但这是一个相当大的主题,超出了这个问题的范围。

fetchUsers实现在哪里,“递归展开”展平对象我不确定这是否是您想要在那里执行的操作。@ThomasAndolf我已用缺少的method@ThomasAndolf这是我正在使用的扩展,但正如我所说的,它无法获取第二页