Angular中请求blob数据以及显示blob失败并提示 sanitizing unsafe URL value blob的解决办法

Angular中请求blob数据的请求

Angular中的网络请求非常简单,
我们导入HttpClientModule后,在类构造函数中注入 HttpClient 后就可以使用其提供好的相关请求方法了,这里不再赘述了

    constructor(
        private _httpClient: HttpClient,
    ) {
        
    }

我们先来看一下 HttpClient 这个类的相关注释。
HttpClient 是一个可注入的类,带有执行HTTP请求的方法。
每个请求方法都有多个签名,返回类型根据不同的签名而不同(主要是observe和responseType)

在这里插入图片描述

大多数情况下,接口给我们返回的都是json格式的字符串。httpClient请求的默认类型也是json的
那如果接口返回一个blob类型数据或者是其他类型的数据,我们就需要通过指定 responseType 来达到我们的目的了

假如接口返回的是一个blob类型的图片,以get请求为例,我们只需要在请求时指定一下
responseType: ‘blob’ 即可

this._httpClient.get('server url', {
            responseType: 'blob'
        })

当我们指定 responseTypeblob 时就会执行下面这个方法,可以看到其返回值的泛型约束也是 Blob 类型的

在这里插入图片描述
看源码可以发现,我们可以指定的 responseType 类型有很多,我们根据接口返回类型调整即可

在这里插入图片描述

Angular显示Blob图片

我们拿到返回的blob数据后,只需要将Blob转成Url绑定到img标签即可

代码如下

ts代码

this.iconUrl=URL.createObjectURL(resp)

html代码:

 <img [src]="iconUrl">

参考资料: URL.createObjectURL()

但是,以上代码本地运行可能会发现图片并没有显示出来,控制台给出了一个警告,警告大致如下:

core.js:11208 WARNING: sanitizing unsafe URL value blob:http://localhost:4200/498d63bd-298d-4d60-8497-3eaaf6fd480f (see http://g.co/ng/security#xss)

大致意思就是为了防止xss攻击,Angular将绑定的iconUr识别为不安全的Url并自动清除了它,参考资料如下: https://angular.io/guide/security#xss

参考资料中也给出了解决办法:
感兴趣的可以了解一下 https://angular.io/guide/security#bypass-security-apis

大致原理就是你告诉Angular这个Url是你检查过的、安全的。

代码如下:
首先注入 DomSanitizer

    constructor(
        private sanitizer: DomSanitizer
    ) {
    }

我们发现 DomSanitizer 提供了以下方法
在这里插入图片描述

那我们只需要将

this.iconUrl=URL.createObjectURL(resp)

修改为

this.iconUrl = this.sanitizer.bypassSecurityTrustUrl(window.URL.createObjectURL(resp));

这样一来,图片就可以正常显示了。



如果你觉得本文对你有帮助,麻烦动动手指顶一下,可以帮助到更多的开发者,如果文中有什么错误的地方,还望指正,码字不易,转载请注明转自喻志强的博客 ,谢谢!

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Angular 使用 GET 请求传递数据给后端可以通过以下步骤实现: 1. 引入 HttpClientModule 模块 在 app.module.ts 文件引入 HttpClientModule 模块: ``` import { HttpClientModule } from '@angular/common/http'; @NgModule({ imports: [ HttpClientModule ] }) export class AppModule { } ``` 2. 创建服务 在创建的服务定义一个方法,用于发送 GET 请求。例如: ``` import { Injectable } from '@angular/core'; import { HttpClient } from '@angular/common/http'; @Injectable({ providedIn: 'root' }) export class DataService { constructor(private http: HttpClient) { } getData(data: any) { return this.http.get('http://localhost:8080/api/data', { params: data }); } } ``` 3. 在组件使用服务 在需要使用 GET 请求的组件引入并注入服务,然后调用服务定义的方法: ``` import { Component } from '@angular/core'; import { DataService } from './data.service'; @Component({ selector: 'app-root', template: ` <button (click)="getData()">Get Data</button> ` }) export class AppComponent { constructor(private dataService: DataService) { } getData() { const data = { name: 'John', age: '30' }; this.dataService.getData(data).subscribe((response) => { console.log(response); }); } } ``` 在上面的例子,`getData()` 方法调用了 `dataService` 定义的 `getData()` 方法,并传递了一个包含数据的对象作为参数。在服务,`params` 属性用于将数据作为查询参数传递给后端。在组件,通过订阅服务方法返回的 Observable 来获取从后端返回的数据

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喻志强的博客

码字不易,鼓励随意。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值