I am using Polymer 1.6 and <iron-ajax>
for my API calls. I cannot distinguish between these two situations based on iron-ajax-error
event:
403 Forbidden
) 404 Not Found
) In both situations, the response body is empty even though in the authentication problem, the server responds with a JSON body.
I would like to read the response status code, or be able to get the response body in situation 1.
When the server responds with an error, the response body is supposed to be null
according to the spec . However, <iron-ajax>
's event detail still provides access to the status code and status text.
<iron-ajax>.response
event The event detail of the <iron-ajax>.response
event is an <iron-request>
. The status code is stored in <iron-request>.status
and the corresponding text is in <iron-request>.statusText
:
_onResponse: function(e) {
const req = e.detail; // iron-request
console.log('status', req.status, req.statusText);
}
HTMLImports.whenReady(() => { Polymer({ is: 'x-foo', _onResponse: function(e) { const req = e.detail; console.log('response', req.status, req.statusText); this.responseStatus = req.status; this.responseStatusText = req.statusText; }, _onError: function(e) { const req = e.detail.request; const err = e.detail.error; console.log('error', err, req.status, req.statusText); this.errorStatus = req.status; this.errorStatusText = req.statusText; this.errorMessage = err; } }); });
<head> <base href="https://polygit.org/polymer+1.11.1/components/"> <script src="webcomponentsjs/webcomponents-lite.js"></script> <link rel="import" href="polymer/polymer.html"> <link rel="import" href="iron-ajax/iron-ajax.html"> </head> <body> <x-foo></x-foo> <dom-module id="x-foo"> <template> <iron-ajax url="//httpbin.org/status/200" auto on-response="_onResponse" on-error="_onError"></iron-ajax> <div>'on-response' status: [[responseStatus]] ([[responseStatusText]])</div> </template> </dom-module> </body>
<iron-ajax>.error
event Note the <iron-ajax>.error
event's detail is different from that of the <iron-ajax>.response
. The error
's event detail is an object with the following shape:
{
error: String,
request: iron-request
}
So the <iron-ajax>.error
event handler could read the status and status text as follows:
_onError: function(e) {
const req = e.detail.request; // iron-request
console.log('status', req.status, req.statusText);
}
HTMLImports.whenReady(() => { Polymer({ is: 'x-foo', _onResponse: function(e) { const req = e.detail; console.log('response', req.status, req.statusText); this.responseStatus = req.status; this.responseStatusText = req.statusText; }, _onError: function(e) { const req = e.detail.request; const err = e.detail.error; console.log('error', err, req.status, req.statusText); this.errorStatus = req.status; this.errorStatusText = req.statusText; this.errorMessage = err; } }); });
<head> <base href="https://polygit.org/polymer+1.11.1/components/"> <script src="webcomponentsjs/webcomponents-lite.js"></script> <link rel="import" href="polymer/polymer.html"> <link rel="import" href="iron-ajax/iron-ajax.html"> </head> <body> <x-foo></x-foo> <dom-module id="x-foo"> <template> <iron-ajax url="//httpbin.org/status/404" auto on-response="_onResponse" on-error="_onError"></iron-ajax> <div>'on-error' status: [[errorStatus]] ([[errorStatusText]]) - [[errorMessage]]</div> </template> </dom-module> </body>
When I want to see the response for error cases, I register an handler function to error
event and look up e.detail.response
or e.detail.request.xhr.response
, like followings:
<dom-module id="my-login">
<template>
<iron-ajax url="http://some-url.com"
method="POST"
content-type="application/x-www-form-urlencoded"
body="{{reqBody}}"
handle-as="json"
on-response="onResponse"
on-error="onError" id="xhr"></iron-ajax>
</template>
<script>
Polymer({
is: 'my-component',
properties: {
reqBody: {
type: Object,
value: {}
}
},
onResponse: function(e) {
console.log(e.detail.response);
},
onError: function(e) {
// I think one of those two would be what you're looking for.
console.log(e.detail.response);
console.log(e.detail.request.xhr.response);
}
});
</script>
</dom-module>
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.