Servicio para realizar solicitudes AJAX en aplicaciones Ember.
ember-ajax
ahora está en desuso. Considere usar ember-fetch
o ember-ajax-fetch
como un reemplazo más directo.
Si recién estás comenzando, ¡ya tienes ember-ajax
instalado! Sin embargo, si falta en su package.json
, puede agregarlo haciendo:
ember install ember-ajax
Para utilizar el servicio ajax, inyecte el servicio ajax
en su ruta o componente.
import Ember from 'ember' ;
export default Ember . Route . extend ( {
ajax : Ember . inject . service ( ) ,
model ( ) {
return this . get ( 'ajax' ) . request ( '/posts' ) ;
}
} ) ;
El servicio AJAX proporciona métodos que se utilizarán para realizar solicitudes AJAX, de forma similar a como usaría jQuery.ajax
. De hecho, ember-ajax
es un contenedor del método de jQuery y se puede configurar de la misma manera.
En general, utilizará el método request(url, options)
, donde url
es el destino de la solicitud y options
es un hash de configuración para jQuery.ajax
.
import Ember from 'ember' ;
export default Ember . Controller . extend ( {
ajax : Ember . inject . service ( ) ,
actions : {
sendRequest ( ) {
return this . get ( 'ajax' ) . request ( '/posts' , {
method : 'POST' ,
data : {
foo : 'bar'
}
} ) ;
}
}
} ) ;
En este ejemplo, this.get('ajax').request()
devolverá una promesa con el resultado de la solicitud. Su código de controlador dentro de .then
o .catch
se incluirá automáticamente en un bucle de ejecución de Ember para una máxima compatibilidad con Ember, desde el primer momento.
Puede omitir la configuración del method
o type
claves en su objeto options
al llamar request(url, options)
llamando en su lugar post(url, options)
, put(url, options)
, patch(url, options)
o del(url, options)
.
post ( '/posts' , { data : { title : 'Ember' } } ) ; // Makes a POST request to /posts
put ( '/posts/1' , { data : { title : 'Ember' } } ) ; // Makes a PUT request to /posts/1
patch ( '/posts/1' , { data : { title : 'Ember' } } ) ; // Makes a PATCH request to /posts/1
del ( '/posts/1' ) ; // Makes a DELETE request to /posts/1
ember-ajax
le permite especificar los encabezados que se utilizarán con una solicitud. Esto es especialmente útil cuando tiene un servicio de sesión que proporciona un token de autenticación que debe incluir con las solicitudes para autorizar sus solicitudes.
Para incluir encabezados personalizados que se utilizarán con sus solicitudes, puede especificar el hash headers
en el Ajax Service
.
// app/services/ajax.js
import Ember from 'ember' ;
import AjaxService from 'ember-ajax/services/ajax' ;
export default AjaxService . extend ( {
session : Ember . inject . service ( ) ,
headers : Ember . computed ( 'session.authToken' , {
get ( ) {
let headers = { } ;
const authToken = this . get ( 'session.authToken' ) ;
if ( authToken ) {
headers [ 'auth-token' ] = authToken ;
}
return headers ;
}
} )
} ) ;
Los encabezados de forma predeterminada solo se pasan si los hosts coinciden o si la solicitud es una ruta relativa. Puede sobrescribir este comportamiento pasando un host con la solicitud, configurando el host para el servicio ajax o configurando una matriz de trustedHosts
que pueden ser una matriz de cadenas o expresiones regulares.
// app/services/ajax.js
import Ember from 'ember' ;
import AjaxService from 'ember-ajax/services/ajax' ;
export default AjaxService . extend ( {
trustedHosts : [ / .example. / , 'foo.bar.com' ]
} ) ;
La propiedad namespace
se puede utilizar para anteponer solicitudes con un espacio de nombres de URL específico.
// app/services/ajax.js
import Ember from 'ember' ;
import AjaxService from 'ember-ajax/services/ajax' ;
export default AjaxService . extend ( {
namespace : '/api/v1'
} ) ;
request('/users/me')
ahora apuntaría /api/v1/users/me
Si necesita anular el espacio de nombres para una solicitud personalizada, utilice el namespace
como una opción para los métodos de solicitud.
// GET /api/legacy/users/me
request ( '/users/me' , { namespace : '/api/legacy' } ) ;
ember-ajax
le permite especificar un host que se utilizará con una solicitud. Esto es especialmente útil para que no tenga que pasar continuamente el host junto con la ruta, lo que hace que request()
sea un poco más limpio.
Para incluir un host personalizado para usar con sus solicitudes, puede especificar la propiedad host
en el Ajax Service
.
// app/services/ajax.js
import Ember from 'ember' ;
import AjaxService from 'ember-ajax/services/ajax' ;
export default AjaxService . extend ( {
host : 'http://api.example.com'
} ) ;
Eso le permite solo tener que hacer una llamada a request()
como tal:
// GET http://api.example.com/users/me
request ( '/users/me' ) ;
ember-ajax
le permite especificar un encabezado de tipo de contenido predeterminado para usar con una solicitud.
Para incluir un tipo de contenido personalizado, puede especificar la propiedad contentType
en el Ajax Service
.
// app/services/ajax.js
import Ember from 'ember' ;
import AjaxService from 'ember-ajax/services/ajax' ;
export default AjaxService . extend ( {
contentType : 'application/json; charset=utf-8'
} ) ;
También puede anular el tipo de contenido por request
con el parámetro options
.
Algunas API responden con el código de estado 200, aunque se haya producido un error, y proporcionan un código de estado en la carga útil. Con el servicio, puedes dar cuenta fácilmente de este comportamiento sobrescribiendo el método isSuccess
.
// app/services/ajax.js
import AjaxService from 'ember-ajax/services/ajax' ;
export default AjaxService . extend ( {
isSuccess ( status , headers , payload ) {
let isSuccess = this . _super ( ... arguments ) ;
if ( isSuccess && payload . status ) {
// when status === 200 and payload has status property,
// check that payload.status is also considered a success request
return this . _super ( payload . status ) ;
}
return isSuccess ;
}
} ) ;
ember-ajax
proporciona clases de error integradas que puede usar para verificar el error devuelto por la respuesta. Esto le permite restringir la determinación del resultado del error al servicio en lugar de distribuirlo alrededor de su código.
ember-ajax
tiene tipos de error integrados que el servicio devolverá en caso de error:
BadRequestError
(400)UnauthorizedError
(401)ForbiddenError
(403)NotFoundError
(404)InvalidError
(422)ServerError
(5XX)AbortError
TimeoutError
Todos los errores anteriores son subtipos de AjaxError
.
ember-ajax
viene con funciones de ayuda para hacer coincidir los errores de respuesta con su respectivo tipo de error ember-ajax
. Cada uno de los errores enumerados anteriormente tiene una función is*
correspondiente (por ejemplo, isBadRequestError
).
Se recomienda encarecidamente el uso de estas funciones para ayudar a eliminar la necesidad de un código de detección de errores repetitivo.
import Ember from 'ember' ;
import {
isAjaxError ,
isNotFoundError ,
isForbiddenError
} from 'ember-ajax/errors' ;
export default Ember . Route . extend ( {
ajax : Ember . inject . service ( ) ,
model ( ) {
const ajax = this . get ( 'ajax' ) ;
return ajax . request ( '/user/doesnotexist' ) . catch ( function ( error ) {
if ( isNotFoundError ( error ) ) {
// handle 404 errors here
return ;
}
if ( isForbiddenError ( error ) ) {
// handle 403 errors here
return ;
}
if ( isAjaxError ( error ) ) {
// handle all other AjaxErrors here
return ;
}
// other errors are handled elsewhere
throw error ;
} ) ;
}
} ) ;
Si sus errores no son estándar, la función auxiliar para ese tipo de error se puede utilizar como base para crear su función de detección personalizada.
Si necesita acceder a la respuesta json de una solicitud que falló, puede usar el método raw
en lugar de request
.
this . get ( 'ajax' )
. raw ( url , options )
. then ( ( { response } ) => this . handleSuccess ( response ) )
. catch ( ( { response , jqXHR , payload } ) => this . handleError ( response ) ) ;
Tenga en cuenta que en este caso de uso no hay acceso al objeto de error. Puede inspeccionar el objeto jqXHR
para obtener información adicional sobre la solicitud fallida. En particular, jqXHR.status
devuelve el código de error HTTP relevante.
Ember AJAX proporciona un mixin que se puede usar en un adaptador de datos Ember para evitar el código de red proporcionado por Ember Data y confiar en Ember AJAX en su lugar. Esto sirve como un primer paso hacia una verdadera integración de Ember AJAX en Ember Data.
Para usar el mixin, puedes incluirlo en un Adaptador, así:
// app/adapters/application.js
import DS from 'ember-data' ;
import AjaxServiceSupport from 'ember-ajax/mixins/ajax-support' ;
export default DS . JSONAPIAdapter . extend ( AjaxServiceSupport ) ;
¡Esa es toda la configuración requerida! Si desea personalizar el adaptador, como por ejemplo utilizar un servicio AJAX alternativo (como uno que usted mismo extendió), se proporcionan enlaces para hacerlo; Consulte la implementación del mixin para obtener más detalles.
Tenga en cuenta que en lugar de utilizar el código de comprobación de errores de Ember Data en su aplicación, debe utilizar los proporcionados por Ember AJAX.
Si no está utilizando Ember Data y no tiene acceso a los servicios, puede importar la utilidad ajax de esta manera:
import request from 'ember-ajax/request' ;
export default function someUtility ( url ) {
var options = {
// request options
} ;
return request ( url , options ) . then ( response => {
// `response` is the data from the server
return response ;
} ) ;
}
El cual tendrá la misma API que el servicio ajax
. Si desea el objeto jQuery XHR sin formato, puede utilizar el método raw
:
import raw from 'ember-ajax/raw' ;
export default function someOtherUtility ( url ) {
var options = {
// raw options
} ;
return raw ( url , options ) . then ( result => {
// `result` is an object containing `response` and `jqXHR`, among other items
return result ;
} ) ;
}
Esta información solo es relevante si desea contribuir a ember-ajax
.
git clone
este repositorionpm install
ember server
ember test
ember test --server
ember build
Para obtener más información sobre el uso de ember-cli, visite http://www.ember-cli.com/.