GVKun编程网logo

Angular $ http服务-强制不解析对JSON的响应(angular.json详解)

7

本文的目的是介绍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 $ 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修改服务中的响应

Angular HttpClient修改服务中的响应

我正在升级到Angular到版本5,之前我正在使用@ angular / http,现在我需要更新到@ angular / common / http并使用 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获得的响应…就像添加一些项目,或者在重新调整它之前做一些更多的东西

解决方法

这一切都取决于RxJ的版本. Angular 6附带RxJs 6 – 这意味着map()/ catch()方法不再有效.

相反,您必须使用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服务

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服务后,组件就可以用AJAXJSONP两种方式发送数据请求了。先大概讲解一下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服务工具类

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服务工具类

import { Injectable } from "@angular/core"; import { HttpClient, HttpHeaders } from ''@angular/common/http''; import { Observable } from ''rxjs''; import { map, catchError } from ''rxjs/operators'';
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服务

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服务的相关知识,请在本站寻找。

本文标签: