angular 4 httpclient xml response
Solution 1
Set the responseType
to text
:
this.http.get('getXmlUrl', { responseType: 'text' }).subscribe(response => {
console.log(response);
});
Allowed values for responseType
:
arraybuffer
blob
-
json
(default) text
The responseType value determines how a successful response body will be parsed.
See Angular Docs:
HttpRequest # responseType
HttpClient # request()
Solution 2
2019 Angular 7 above HttpClient Note with Code
Get Angular Response as Text or Xml NOT as Json
Some subtle changes may have occurred in Angular 7 after the other previous answers were written. This is like a detailed comment with code to MA-Maddin's answer.
@Injectable()
export class MyWidgetService
private myHttpClient: HttpClient;
constructor(httpClient: HttpClient) {
super(httpClient); // you MIGHT need this
this.myHttpClient = httpClient;
}
getResAsObservableStr = () => {
// Override the JSON Default Behavior.
// 3 special things for text from HttpClient
// a: Calling the raw .get('url') NOT get<string>('url')
// b: override observe: 'body'
// c: override responseType: 'text'
return this.myHttpClient.get('pathUrlForCall'
, { observe: 'body', responseType: 'text'} );
}
// In Calling Coponent
export class MyWidgetComponent
valAsStr: string;
constructor(
// more vars like Router...
private myWidgetSvcRef: MyWidgetService) { }
ngOnInit() {
this.getMyStrValFromWeb();
} // ngOnInit end
getMyStrValFromWeb = () => {
this.myWidgetSvcRef.getResAsObservableStr()
.subscribe(valAsStr => {this.valAsStr = valAsStr; });
} // end getMyStrValFromWeb
// in your html template (one possible scenario)
<someControl [(ngModel)]="valAsStr" > </someControl>
Solution 3
The issue here is the HttpHeaders are immutable in angular. So instead of setting the values, you should set when you create the object. Something like
const headers = new HttpHeaders({ 'Content-Type': 'text/xml' }).set('Accept', 'text/xml');
But you are setting only request headers. If you want your response to be text/xml.
this.http.get('getxmlurl', { headers: headers, responseType: text/xml }).subscribe(response => { return response; });
You can remove headers unless you want to set request headers.
user2106630
Updated on April 13, 2021Comments
-
user2106630 about 3 years
const headers = new HttpHeaders({ 'Content-Type': 'text/xml' }); headers.append('Accept', 'text/xml'); headers.append('Content-Type', 'text/xml'); this.http.get('getxmlurl', {headers: headers}).subscribe(response => { return '1234'; });
Hi I am using angular 4 httpclient to make a http get request from a spring controller which returns a XML response.
The problem I have is the response is ALWAYS NULL even though I can see the xml response from the chrome developer network tab.
I thought it might be something to do with the request header, angular 4 defaults to json however I am unable to change the request header with the code above. Can someone please advice.
Thanks
-
Ka Mok almost 6 yearsresponseType: text NOT text/xml
-
Sql Surfer almost 5 yearsfor Observable<string> it may also be a requirement to set observe: 'body' ... this.myHttpCliVar.get('pathToMyTargetUrl' , { observe: 'body', responseType: 'text'} ).subscribe(valAsStr => {this.localStrVar = valAsStr; }); notice that it is .get(...) not get<string>(...)
-
ontananza almost 5 yearsOn angular 8 don't forget cast as object
<Object>{ responseType: 'text' }
-
Martin Schneider almost 5 years"If
responseType
is the defaultjson
, you can pass a type interface for the resulting object as a type parameter to the call.". See also Overload #3 of theget()
method in docs: The return value ofresponseType: 'text'
isObservable<string>
. -
Arun s over 3 yearsThanks for the answer. Passing { observe: 'body', responseType: 'text'} as options served the purpose. Its working for me