我正在使用Spring WebFlux编写http爬虫程序,它很容易并行执行和设置http超时:
val sitesToCrawl: Flux<String> = streamOfUrl()
val concurrencyLimit = 100
sitesToCrawl.flatMap(
{ WebClient.create().get().uri(it).exchange().timeout(Duration.ofSeconds(10)) },
concurrencyLimit
)
但是如何限制页面响应大小,比如我不想为每个URL下载超过500KB的数据。读取HTTP头Content-Length是不可靠的。我想我需要降低一个级别,直接使用字节缓冲区和Netty事件,但最好使用flux/mono来包装它,以继续使用这些原语
如果使用Spring Boot,则应该使用自动配置的webclient.builder
创建webclient
;这将反映Spring Boot的意见,例如,将根据您选择的配置选项配置Jackson解码。
您还应该构建一个并将其用于许多请求,而不是为每个请求创建一个新的客户机实例--这是不有效的。
现在,从Spring Framework 5.1(Spring Boot 2.1)开始,Spring WebFlux附带了一个filterfunction,它只执行以下操作:读取N个字节,然后取消响应(停止读取并关闭连接)。请注意,如果响应相当大,这种行为很有趣,但这样做也会使连接不适合重用,并且不会返回到连接池。如果您在同一台主机上抓取大量页面,那么连接池与创建新连接是一个有趣的权衡。
@Component
public class CrawlingService {
private WebClient webClient;
public CrawlingService(WebClient.Builder builder) {
this.webClient = builder.filter(ExchangeFilterFunctions.limitResponseSize(maxSize))
.build();
}
public Mono<Void> crawlPage(URI page) {
return // use webClient here
}
}
问题内容: 我正在通过jQuery的getJson()调用跨域Web服务。由于响应对象的大小很大,因此我在Web服务中使用了最大的JSon大小。我已经检查过getJson()提供正确的响应对象。但是仍然没有调用我的回调函数。Firebug表示已超过(firefox)响应大小。 谁能告诉我标准浏览器(例如,Firefox)处理的最大浏览器响应大小限制是多少,以及如何处理该问题? 这是相同的代码段。
我正在使用一个电子邮件客户端,它将连接到Gmail邮箱并检索特定的电子邮件。 现在,我可以连接到我的邮箱,并可以检索部分电子邮件,而不是全部,无论我的缓冲区有多大,我仍然只能从我的电子邮件中获得1400个字符,然后其余的邮件主体为空。 您可以在此链接中找到电子邮件正文的屏幕截图 http://www.elzouhery.com/Mail 快照.png 提前感谢 编辑 请参阅下面的完整代码
问题内容: 有没有办法确定内容的大小?我读了这个get-size-of-http-response-in- java问题,但可悲的是我在哪里工作,我无法访问CommonsIO :( 响应内容由单个复杂对象组成,因此我考虑将其写到临时文件中,然后检查该文件。在应用程序在生产环境中运行时,这不是我想做的诊断方法,因此,如果可能的话,请避免使用它。 PS我读了埃里克森的答案,但它提到了输入流,我想知道要
问题内容: 如何从WebView获得HTTP标头响应?我找到了半解决方案,但是它是用Objective- C编写的,不能将其转换为Swift(我已经尝试过使用较差的Obj-C知识了)。 Objective-C代码: 该代码将如何看待Swift? 也许现在我们有更好的方法呢?并不总是启用缓存。 问题答案: 迅速 斯威夫特更严格; 您想保护自己免受指针和: 检查实际是否有 检查实际是否有 对响应进行类
主要内容:HTTP响应完整格式HTTP响应完整格式 HTTP的响应也由三部分组成(响应行+响应头+响应体): 以下是一个实际的HTTP响应示例: ①报文协议及版本; ②状态码及状态描述; ③响应报文头,也是由多个属性组成; ④响应报文体,即我们真正要的“干货”。
基本响应 当然,所有的路由及控制器必须返回某个类型的响应,并发送回用户的浏览器。Laravel 提供了几种不同的方法来返回响应。最基本的响应就是从路由或控制器简单的返回一个字符串: $router->get('/', function () { return 'Hello World'; }); 指定的字符串会被框架自动转换成 HTTP 响应。 响应对象 但是,对于大多数路由和控制器行为