Angular 6 - 从 httpClient 获取 csv 响应
Posted
技术标签:
【中文标题】Angular 6 - 从 httpClient 获取 csv 响应【英文标题】:Angular 6 - get csv response from httpClient 【发布时间】:2019-08-08 19:23:21 【问题描述】:任何人都可以举一个从 Angular 6 httpClient 获取应用程序/八位字节流响应的示例。我正在使用下面的代码,但它不起作用(我收到未知错误 - 401 响应) -
import saveAs from 'file-saver';
getJobOutput()
this.workflowService.fetchOutput(this.jobId,this.outputId).subscribe((response : any) => // download file
var blob = new Blob([response.blob()], type: 'application/octet-stream');
var filename = 'file.csv';
saveAs(blob, filename);
);
服务如下 -
fetchOutput(jobId : string, outputId)
var jobOutputURL = "myEnpoint";
var params = this.createHttpAuthorization(jobOutputURL,"GET");
params["format"] = "csv";
const options =
headers: new HttpHeaders( 'Content-Type': 'application/octet-stream',
'Accept' : 'application/octet-stream',
'Access-Control-Allow-Origin' : '*'
);
var endpoint = `$jobOutputURL?oauth_consumer_key=$params["oauth_consumer_key"]&oauth_signature_method=$params["oauth_signature_method"]&oauth_nonce=$params["oauth_nonce"]&oauth_timestamp=$params["oauth_timestamp"]&oauth_version=1.0&format=$params["format"]&oauth_signature=$params["oauth_signature"]`;
return this.httpClient.get(endpoint, ...options, responseType: 'blob');
【问题讨论】:
您的请求看起来不错,如果您收到401
,则您无权下载.csv
。检查您的 API,是否允许您访问。
401 错误表示“未经授权”。您确定您已授权该请求吗?
是的。在 jquery 中询问时相同的请求工作正常。
这个请求有效 - this.getOutputFileURL = function(jobId, outputId, format) var type = "GET", url = this.apiLocation + "/jobs/" + jobId + "/output/ " + outputId + "/", 参数 = buildOauthParams(this.apiKey); $.extend(params, format: format || "Raw"); var signature = generateSignature(type, url, params, this.apiSecret); $.extend(params, oauth_signature: 签名); window.location.assign(url + "?" + $.param(params)); ;
【参考方案1】:
要获取应用程序/八位字节流,您必须将 arraybuffer
设置为 Angular HttpHeaders
中的响应类型。
这是服务方法:
fetchOutput(): Observable<ArrayBuffer>
let headers = new HttpHeaders();
const options:
headers?: HttpHeaders;
observe?: 'body';
params?: HttpParams;
reportProgress?: boolean;
responseType: 'arraybuffer';
withCredentials?: boolean;
=
responseType: 'arraybuffer'
;
return this.httpClient
.get('https://your-service-url.com/api/v1/your-resource', options)
.pipe(
map((file: ArrayBuffer) =>
return file;
)
);
这是对服务方法和saveAs
函数的调用:
this.yourService
.fetchOutput()
.subscribe((data: any) =>
const blob = new Blob([data], type: 'application/octet-stream' );
const fileName = 'Your File Name.csv';
saveAs(blob, fileName);
)
正如其他用户的建议:401 Unauthorized 通常是由于缺少凭据而导致的客户端错误。
【讨论】:
您好 Julien,感谢您提供上面的代码。我仍然是一个带有 401(未经授权)错误的 GET 请求。但是,当我粘贴到邮递员上时,相同的 URL 给了我正确的响应。我怀疑这是授权问题,因为我能够访问托管在同一服务器上的其他类型的 API。 你是用windows认证,还是用什么授权? postman 等工具可以隐式设置授权,而 Angular 则不能。 我正在使用 oauth 1.0 并设置这些参数 - oauth_consumer_key, oauth_signature_method: HMAC-SHA1 oauth_nonce, oauth_timestamp, oauth_version: 1.0 此外,其他 GET 请求使用这些 oauth 1.0 参数(通过我的 Angular 6 应用程序) . oauth_signature: VTat UuyYG5bWrpSZ18lJfFeUjQ= 尝试以下操作之一:将 Angular 通过 chrome 开发人员网络选项卡生成的 URL 与邮递员创建的 URL 进行比较。仔细检查 Angular 设置的标题,并将它们与邮递员创建的进行比较。尝试在您的后端调试授权方法,以检查您在 Angular 中定义的参数是否正确到达您的端点。 @Aetherix 是的,在上述情况下,map 运算符不是必需的,尽管我添加它是为了表明您可以更改 observable 的输出以上是关于Angular 6 - 从 httpClient 获取 csv 响应的主要内容,如果未能解决你的问题,请参考以下文章
在 Angular 6 中使用 HttpClient 下载文件
Angular 6 - httpClient 在 httpOptions 中传递基本身份验证
Angular 6 HTTPClient:请求触发一次,收到2个响应
如何在 Angular 6 中使用 HttpClient 禁用缓存
Angular 6 和 Spring boot - 无法使用简单的 HttpClient 调用获取数据
当我在 HttpInterceptor 类中注入使用 HttpClient 的服务时,Angular 6 进入循环依赖的无限循环