本文的目的是介绍Angular$http服务-强制不解析对JSON的响应的详细情况,特别关注angular.json详解的相关信息。我们将通过专业的研究、有关数据的分析等多种方式,为您呈现一个全面的了
本文的目的是介绍Angular $ http服务-强制不解析对JSON的响应的详细情况,特别关注angular.json详解的相关信息。我们将通过专业的研究、有关数据的分析等多种方式,为您呈现一个全面的了解Angular $ http服务-强制不解析对JSON的响应的机会,同时也不会遗漏关于Angular HttpClient修改服务中的响应、Angular HTTP服务、Angular http服务工具类、Angular2 http服务的知识。
本文目录一览:- Angular $ http服务-强制不解析对JSON的响应(angular.json详解)
- Angular HttpClient修改服务中的响应
- Angular HTTP服务
- Angular http服务工具类
- Angular2 http服务
Angular $ http服务-强制不解析对JSON的响应(angular.json详解)
我的服务器中有一个“ test.ini”文件,包含以下文本:
"[ALL_OFF] [ALL_ON]"
我正在尝试通过$http
服务获取此文件的内容,这是我的功能的一部分:
var params = { url: ''test.ini''}; $http(params).then( function (APIResponse) { deferred.resolve(APIResponse.data); }, function (APIResponse) { deferred.reject(APIResponse); });
此操作收到了一个Angular异常(SyntaxError:意外令牌A)。
我打开了Angular框架文件,然后找到了例外:
因为文本文件的内容以“ [ ] 开头,以“ ] ” 结尾,因此Angular“认为”是一个JSON文件。
这是Angular代码( 1.2.23版本中的 7474行):
var defaults = this.defaults = { // transform incoming response data transformResponse: [function(data) { if (isString(data)) { // strip json vulnerability protection prefix data = data.replace(PROTECTION_PREFIX, ''''); if (JSON_START.test(data) && JSON_END.test(data)) data = fromJson(data); } return data; }],
我的问题:
如何 强制 angular 不 进行此检查(if (JSON_START.test(data) &&JSON_END.test(data))
)并且 不 解析对JSON的文本响应?
答案1
小编典典您可以通过以下方法覆盖默认值:
$http({ url: ''...'', method: ''GET'', transformResponse: [function (data) { // Do whatever you want! return data; }]});
上面的函数替换了您为该HTTP请求设置的默认函数。
或者读此,他们写的“改变默认的转换每请求”。
Angular HttpClient修改服务中的响应
HttpClient
我已经在服务中(而不是在组件中)发出http请求,这使得它们易于重用
这就是我已经拥有的(来自已弃用的http)
return this.http.get(url,{headers: this.headers}).map( (response: Response) => { const data = response.json(); // Does something on data.data // return the modified data: return data.data; } ).catch( (error: Response) => { return Observable.throw(error); } );
现在从我从新的HttpClient中学到的东西,就像我无法修改响应并将其提供给订阅它的组件方法.
我应该如何修改对HTTP请求的响应并在从Observable返回之前轻松访问它?
我只想要同样的能力修改我从API获得的响应…就像添加一些项目,或者在重新调整它之前做一些更多的东西
解决方法
相反,您必须使用pipe map()/ catchError(),如下所示:
在Angular 6 / RxJs 6之前 – 使用经典的Http:
return this.http.get(url,{headers: this.headers}).map( (response: Response) => { const data : SomeType = response.json() as SomeType; // Does something on data.data // return the modified data: return data.data; // assuming SomeType has a data properties. Following OP post } ).catch( (error: Response) => { return Observable.throw(error); } );
应改为:
在Angular 6 / RxJs 6之后 – HttpClient迁移:
return this.http.get<SomeType>(url,{headers: this.headers}) .pipe( map( response => { // NOTE: response is of type SomeType // Does something on response.data // modify the response.data as you see fit. // return the modified data: return response; // kind of useless }),catchError( error => { return Observable.throw(error); }) ); // end of pipe
在管道中,map()将获取响应对象(已经从Json解析),如果http失败,catchError()将获取第一个错误.
另外,请注意您的Headers也需要是HttpHeaders对象.
读取RxJs 6中的pipe,map和catchError
Angular HTTP服务
HTTP服务
HTTP服务是Angular中使用HTTP协议与远程服务器进行通讯的一个独立模块,要使用它需要三个步骤
- 在根模块中导入HttpModule,我们通过
Http
客户端,使用熟悉的 HTTP 请求/回应协议与服务器通讯。Http
客户端是Angular的HTTP库所提供的一系列服务之一。
import { HttpModule } from ''@angular/http'';
...
@NgModule({
imports:[
...
HttpModule
],
...
- 在组件模块中导入HTTP服务
import { Http } from ''@angular/http'';
- 在组件构造函数中声明引入
constructor(private http: Http){
...
}
引入HTTP服务后,组件就可以用AJAX和JSONP两种方式发送数据请求了。先大概讲解一下Http服务类,它可以做下面这些事,get、post、put... (RequestOptionsArgs是HTTP请求参数)
HTTP 教程
class Http {
constructor(_backend: ConnectionBackend, _defaultOptions: RequestOptions)
request(url: string|Request, options?: RequestOptionsArgs) : Observable<Response>
get (url: string, options?: RequestOptionsArgs) : Observable<Response>
post (url: string, body: any, options?: RequestOptionsArgs) : Observable<Response>
put (url: string, body: any, options?: RequestOptionsArgs) : Observable<Response>
delete (url: string, options?: RequestOptionsArgs) : Observable<Response>
patch (url: string, body: any, options?: RequestOptionsArgs) : Observable<Response>
head (url: string, options?: RequestOptionsArgs) : Observable<Response>
options(url: string, options?: RequestOptionsArgs) : Observable<Response>
}
AJAX
AJAX是使用XMLHttpRequest对象向服务器发送请求并处理响应的通讯技术。XMLHttpRequest支持同步和异步的方式发送请求,但一般只用异步方式。
处理异步操作的方式有几种,Angular推荐使用Observable,它的HTTP服务的API接口返回的也是Observable对象。Observable是响应式编程模型Rx的核心概念,RxJS是它的JavaScript版本。注意RxJS的Observable实现的是"冷"模式,只有被订阅后才会发送请求。记得导入rxjs的操作符
一般我们将数据服务单独创建为一个服务类,需要引入
import { Injectable } from ''@angular/core'';
import { Http, RequestOptions, Headers } from ''@angular/http'';
import ''rxjs/add/operator/map''; //根据需要导入合适的操作符
import { Observable } from ''rxjs/Observable'';
import ''rxjs/add/operator/catch'';
一般也就用get和post,
const DATES_URL = ''访问路径'';
@Injectable()
export class ContactService {
constructor(private http: Http) {}
getDates():Observable<Response> {
return this.http.get(DATES_URL) //get数据
.map(response=>response.json().data) //通过map操作来对response进行预先处理,转成JSON对象
.catch(this.handleError); //异常处理
}
postDates(date: any): Observable<Response> {
let body = JSON.stringify(date);
let headers = new Headers({''Content-Type'':''application/json''});
let options = new RequestOptions({headers: headers});
return this.http.post(DATES_URL,body,options)
.map(response=>response.json().data)
.catch(this.handleError);
}
private handleError(error: any) {
console.error(''An error occurred'', error);
return Observable.throw(error.message || error);
}
创建好服务后,就可以在别的组件用它了
import { ContactService } from ''刚才的服务类路径'';
@Component({
...
})
export class ... {
constructor(private contactService: ContactService) {}
...
getDate() {
return this.contactService.getDate()
.subscribe(
date => this.date = date,
error => this.erroMessage = <any>error);
}
postDate(date: any) {
if (!any) {return;)
this.contactService.postDate()
.subscribe(
date => this.date.push(date),
error => this.erroMessage = <any>error);
}
}
JSONP
JSONP用于向当前页面不同源的服务器发起AJAX请求,因为<script>标签请求资源不会受到同源策略限制,JSONP就是利用<script>标签来发起GET请求,在这个GET请求中传递callback参数给服务器,然后服务端返回一段JavaScript代码,一般以callback函数包裹着JSON数据的形式返回。注意的是JSONP只能发起GET请求。
根模块加载JsonpModule,然后就可以在服务类中运用了。首先在构造函数中注入JSONP服务,然后使用URLSearchParams对象构造请求参数,最后调用JSONP服务的get()方法发起请求。
import { Injectable } from ''@angular/core'';
import { Jsonp, URLSearchParams } from ''@angular/http'';
import ''rxjs/add/operator/map'';
import { Observable } from ''rxjs/Observable'';
import ''rxjs/add/operator/catch'';
@Injectable()
export class DatesService {
constructor(private jsonp: Jsonp) {}
getDates() {
let URL = ''访问路径'';
let params = new URLSearchParams();
params.set(''foramt'',''json'');
params.set(''callback'',''JSONP_CALLBACK'');
return this.jsonp
.get(URL,{search: params})
.map(response => response.json().date)
.subscribe(
dates => this.dates = dates,
error => this.erroMsg = <any>error)
}
}
最后说明几点
响应数据是JSON字符串格式的,我们必须把这个字符串解析成 JavaScript 对象,只要调一下response.json()就可以了。
解码后的 JSON 不是我们直接想要的结果, 调用的这个服务器总会把 JSON 结果包装进一个带data
属性的对象中。response.json().data才是我们要的
Angular http服务工具类
Angular http服务工具类大致可以分为两个版本,一个是v4.3版本之前位于@angular/http下的Http服务,另一个是v4.3版本之后位于@angular/common/http下HttpClient服务。具体区别可查看https://www.cnblogs.com/54hsh/p/11490711.html
1、@angular/http下的Http服务工具类
import { Injectable } from "@angular/core"; import { Http, Response, RequestOptions, Headers } from ''@angular/http'';import { Observable } from ''rxjs/Observable''; import ''rxjs/add/operator/catch''; import ''rxjs/add/operator/map'';
const options = new RequestOptions({ withCredentials: true, headers: new Headers({ ''X-Requested-With'': ''XMLHttpRequest'' }) });
@Injectable() export class HttpUtil { private baseUrl: any; constructor(private http: Http) { this.baseUrl = ''http://localhost:8080''; }
get(url: string) { console.log(''发送get请求,url:'', url) url = this.baseUrl + url; return this.http.get(url, options) .map(this.extractData) .catch(this.handleError); }
post(url: string, params?: any) { console.log(''发送post请求,url:'', url, '',params:'', params); url = this.baseUrl + url; return this.http.post(url, params, options) .map(this.extractData) .catch(this.handleError); }
put(url: string, params?: any) { console.log(''发送put请求,url:'', url, '',params:'', params); url = this.baseUrl + url; return this.http.put(url, params, options) .map(this.extractData) .catch(this.handleError); }
delete(url: string) { console.log(''发送delete请求,url:'', url); url = this.baseUrl + url; return this.http.delete(url, options) .map(this.extractData) .catch(this.handleError); }
postForm(url: string, params?: any) { let formData: FormData = new FormData(); formData.append(''username'', params.username); formData.append(''password'', params.password); return this.post(url, formData); }
private extractData(response: Response) { console.log(''提取数据:'', response); let body = response.json(); return body || {}; }
private handleError(error: Response | any) { let errMsg: string; if (error instanceof Response) { const body = error.json() || ''''; const err = body.error || JSON.stringify(body); errMsg = `${error.status} - ${error.statusText || ''''} ${err}`; } else { errMsg = error.message ? error.message : error.toString(); } console.error(''异常信息:'', errMsg); return Observable.throw(errMsg); }
}
2、@angular/common/http下的HttpClient服务工具类
const options = { headers: new HttpHeaders({''Content-Type'': ''application/json''}) }
@Injectable() export class HttpClientUtil { private baseUrl: any;
constructor(private httpClient: HttpClient) { this.baseUrl = ''http://localhost:8080''; }
public get(url: string) { console.log(''发送get请求,url:'', url); url = this.baseUrl + url; return this.httpClient.get(url, options) .pipe(map(this.extractData), catchError(this.handleError)); }
public post(url: string, params?: any) { console.log(''发送post请求,url:'', url, '',params:'', params); url = this.baseUrl + url; return this.httpClient.post(url, params, options) .pipe(map(this.extractData), catchError(this.handleError)); }
public put(url: string, params?: any) { console.log(''发送put请求,url:'', url, '',params:'', params); url = this.baseUrl + url; return this.httpClient.put(url, params, options) .pipe(map(this.extractData), catchError(this.handleError)); }
public delete(url: string) { console.log(''发送delete请求,url:'', url); url = this.baseUrl + url; return this.httpClient.delete(url, options) .pipe(map(this.extractData), catchError(this.handleError)); }
postForm(url: string, params?: any) { let formData: FormData = new FormData(); formData.append(''username'', params.username); formData.append(''password'', params.password); return this.post(url, formData); }
private extractData(response: Response) { console.log(''提取数据:'', response); let data = response.json(); return data || {}; }
private handleError(error: Response | any) { let errMsg: string; if (error instanceof Response) { const data = error.json() || ''''; const err = data.toString || JSON.stringify(data); errMsg = `${error.status} - ${error.statusText || ''''} ${err}`; } else { errMsg = error.message ? error.message : error.toString(); } console.error(''异常处理:'', errMsg); return Observable.throw(errMsg); } } import { Http, Response, RequestOptions, Headers } from ''@angular/http'';
import { Observable } from ''rxjs/Observable''; import ''rxjs/add/operator/catch''; import ''rxjs/add/operator/map''; import { Config } from "../app-config";
const options = new RequestOptions({ withCredentials: true, headers: new Headers({ ''X-Requested-With'': ''XMLHttpRequest'' }) });
@Injectable() export class HttpUtil { private baseUrl: any; constructor(private config: Config, private http: Http) { this.baseUrl = config.appConfig.baseUrl; }
get(url: string) { console.log(''发送get请求,url:'', url) url = this.baseUrl + url; return this.http.get(url, options) .map(this.extractData) .catch(this.handleError); }
post(url: string, params?: any) { console.log(''发送post请求,url:'', url, '',params:'', params); url = this.baseUrl + url; return this.http.post(url, params, options) .map(this.extractData) .catch(this.handleError);
}
put(url: string, params?: any) { console.log(''发送put请求,url:'', url, '',params:'', params); url = this.baseUrl + url; return this.http.put(url, params, options) .map(this.extractData) .catch(this.handleError);
}
delete(url: string) { console.log(''发送delete请求,url:'', url); url = this.baseUrl + url; return this.http.delete(url, options) .map(this.extractData) .catch(this.handleError);
}
postForm(url: string, params?: any) { let formData: FormData = new FormData(); formData.append(''username'', params.username); formData.append(''password'', params.password); return this.post(url, formData); }
private extractData(response: Response) { console.log(''提取数据:'', response); let body = response.json(); return body || {}; }
private handleError(error: Response | any) { let errMsg: string; if (error instanceof Response) { const body = error.json() || ''''; const err = body.error || JSON.stringify(body); errMsg = `${error.status} - ${error.statusText || ''''} ${err}`; } else { errMsg = error.message ? error.message : error.toString(); } console.error(''异常信息:'', errMsg); return Observable.throw(errMsg); }
}
总结
以上是小编为你收集整理的Angular http服务工具类全部内容。
如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。
原文地址:https://www.cnblogs.com/54hsh/p/11512818.html
Angular2 http服务
Angular2 http服务
angular2的http服务是用于从后台程序获取或更新数据的一种机制,通常情况我们需要将与后台交换数据的模块做出angular服务,利用http获取更新后台数据,angular使用http的get或put进行后台调用采用的是ajax方式,跨域问题需要单独处理。下面来看一个例子,演示从后台web api中获取数据并进行页面加载。
@H_301_4@1、由于要使用http服务,所以我们一定要在我们的web页面需要引入<scriptsrc="node_modules/angular2/bundles/http.dev.js"></script>,这步很关键,我之前发生的找不到http服务的原因就在此,浪费了很多时间在此。 @H_301_4@2、在angular入口还需引入HTTP_PROVIDERS,并注入,同时由于要使用map,subscribe等所以需要使用rxjs库,那么就需要提前在入口程序中引入import'rxjs/Rx',血的教训import{bootstrap}from'angular2/platform/browser';
import{HTTP_PROVIDERS}from'angular2/http';
import{myFrame}from"./frame/component/myFrame.component";
import'rxjs/Rx';
bootstrap(myFrame,[HTTP_PROVIDERS]);
@H_301_4@3、创建服务///<referencepath="../../../node_modules/angular2/typings/browser.d.ts"/>
import{Injectable}from'angular2/core';
import{Http }from'angular2/http';
@Injectable()
exportclasschannelService{
private_carsUrl:string="http://localhost:6611/api/Chanel";
constructor(private_http:Http){
}
getChannelList(){
returnthis._http.get(this._carsUrl).map(responce=>responce.json())
}
在这个服务中使用了http中的get来获取数据,这里get的url(web api)是与我目前的anuglar应用在一个域内。作为服务我们需要申明该服务是可注入的@Injectable()
@H_301_4@4、服务调用///<referencepath="../../../node_modules/angular2/typings/browser.d.ts"/>
import{Component}from'angular2/core';
import{appService}from'./../service/appsetting.service'
import{channelService}from'./../service/channel.service'
import{Channel}from'./../model/channel'
@Component({
selector:'topNav',
templateUrl:'../app/frame/template/topNav.html',
providers:[appService,channelService]
})
exportclasstopNav{
webTitle:string;
publicitems:Channel[];
constructor(private_appService:appService,private_channelService:channelService){
this.getWebTitle();
this.getChannelList();
}
getWebTitle(){
this.webTitle=this._appService.AppSetting.webTitle;
}
getChannelList(){
this._channelService.getChannelList().subscribe(res=>{this.items=res});
}
}
这里就和普通服务调用没什么区别了,需要先import再在providers中申明,然后在构造函数中注入就行了。
这个例子中有个需要注意的是我们前端model和后端model有可能不一致,那么需要在获取数据后再进行转换,如果类型字段都一致那么可以直接使用,由于是json格式,系统会自动将后台model转换为我们前端使用的model
Web api:
publicclassChanelController:ApiController
{
//GETapi/<controller>
publicIEnumerable<Chanel>Get()
{
returnnewChanel[]{newChanel{ID="1",ChanelName="组织机构"},newChanel{ID="2",ChanelName="通知公告"}};
}
}
注:web api 可以使用Swashbuckle 进行测试,安装 PM>Install-Package Swashbuckle,使用时只需在路径后加入swagger,如http://localhost:6611/swagger/ui/index
学习到这里了,逐步开始向实际应用转换,中间的每一步都是血泪史。关于Angular $ http服务-强制不解析对JSON的响应和angular.json详解的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于Angular HttpClient修改服务中的响应、Angular HTTP服务、Angular http服务工具类、Angular2 http服务的相关知识,请在本站寻找。
本文标签: