1

我正在使用 spring webclient 使用包含 {comment_count} 的 url 发出 Facebook 图形 api 请求

但是,得到这个例外

java.lang.IllegalArgumentException: Not enough variable values available to expand reactive spring

代码片段:

import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.client.WebClient;

import reactor.core.publisher.Mono;

@Component
public class Stackoverflow {

    WebClient client = WebClient.create();

    public Mono<Post> fetchPost(String url) {
        // Url contains "comments{comment_count}"
        return client.get().uri(url).retrieve()
                .bodyToMono(Post.class);
    }
}

我知道resttemplate的解决方案,但我需要使用spring webclient。

4

2 回答 2

5

您可以使用 UriComponentsBuilder 创建您的 URL,如下所示

 webClient.get().uri(getFacebookGraphURI(3)).retrieve().bodyToMono(Object.class);

private URI getFacebookGraphURI(int comments){
   return UriComponentsBuilder.fromHttpUrl("https://graph.facebook.com")
        .pathSegment("v3.2", "PAGE_ID", "posts").queryParam("fields", "comments{comment_count}")
        .queryParam("access_token", "acacaaac").build(comments);

  }

或者

int commentsCount = 3; webClient.get().uri(UriComponentsBuilder.fromHttpUrl(" https://graph.facebook.com ") .pathSegment("v3.2", "PAGE_ID", "posts").queryParam("fields", "comments {comment_count}") .queryParam("access_token", "acacaaac").build().toString(),commentsCount).retrieve().bodyToMono(Object.class);

于 2019-10-03T12:26:50.167 回答
1

我使用的解决方案是禁用 DefaultUriBuilderFactory 中的编码

val urlBuilderFactory = DefaultUriBuilderFactory("https://foo.bar.com").apply {
    encodingMode = EncodingMode.NONE
}

val wc = wcb
    .clone()
    .uriBuilderFactory(urlBuilderFactory)
    .build()

它在 Kotlin 中,在 Java 中你只需要使用DefaultUriBuilderFactory#setEncodingMode(EncodingMode)withNONE作为参数。

由于这种行为变化,您必须自己编码查询参数。为此,我使用

val query = URLEncoder.encode(query_as_string, StandardCharsets.UTF_8.toString())

我可以像这样执行调用:

wc
                .get()
                .uri { it
                        .path(graphqlEndpoints)
                        .queryParam("variables", query)
                        .build()
                }
                .retrieve()
                .bodyToFlux<String>()
                ...
于 2020-03-11T06:59:29.603 回答