خدمة تقديم طلبات AJAX في تطبيقات Ember.
تم الآن إهمال ember-ajax
. من فضلك فكر في استخدام ember-fetch
أو ember-ajax-fetch
كبديل مباشر أكثر.
إذا كنت قد بدأت للتو، فقد قمت بالفعل بتثبيت ember-ajax
! ومع ذلك، إذا كان مفقودًا من package.json
الخاص بك، فيمكنك إضافته عن طريق القيام بما يلي:
ember install ember-ajax
لاستخدام خدمة ajax، أدخل خدمة ajax
في المسار أو المكون الخاص بك.
import Ember from 'ember' ;
export default Ember . Route . extend ( {
ajax : Ember . inject . service ( ) ,
model ( ) {
return this . get ( 'ajax' ) . request ( '/posts' ) ;
}
} ) ;
توفر خدمة AJAX طرقًا يمكن استخدامها لتقديم طلبات AJAX، على غرار الطريقة التي تستخدم بها jQuery.ajax
. في الواقع، ember-ajax
هو عبارة عن غلاف حول طريقة jQuery، ويمكن تهيئته بنفس الطريقة تقريبًا.
بشكل عام، ستستخدم التابع request(url, options)
، حيث يكون url
هو وجهة الطلب options
عبارة عن تجزئة تكوين لـ 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'
}
} ) ;
}
}
} ) ;
في هذا المثال، سيُرجع this.get('ajax').request()
وعدًا بنتيجة الطلب. سيتم تغليف رمز المعالج الخاص بك داخل .then
أو .catch
تلقائيًا في حلقة تشغيل Ember لتحقيق أقصى قدر من التوافق مع Ember، بمجرد إخراجها من الصندوق.
يمكنك تخطي تعيين method
أو type
المفاتيح في كائن options
الخاص بك عند استدعاء request(url, options)
عن طريق استدعاء post(url, options)
أو put(url, options)
أو patch(url, options)
أو del(url, options)
بدلاً من ذلك 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
تحديد الرؤوس التي سيتم استخدامها مع الطلب. يعد هذا مفيدًا بشكل خاص عندما يكون لديك خدمة جلسة توفر رمز مصادقة يتعين عليك تضمينه مع طلبات تفويض طلباتك.
لتضمين رؤوس مخصصة لاستخدامها مع طلباتك، يمكنك تحديد تجزئة headers
في 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 ;
}
} )
} ) ;
يتم تمرير الرؤوس بشكل افتراضي فقط إذا كان المضيفون متطابقين، أو كان الطلب مسارًا نسبيًا. يمكنك استبدال هذا السلوك إما عن طريق تمرير مضيف مع الطلب، أو تعيين المضيف لخدمة ajax، أو عن طريق تعيين مصفوفة من trustedHosts
التي يمكن أن تكون إما مصفوفة من السلاسل أو التعبيرات المنطقية.
// app/services/ajax.js
import Ember from 'ember' ;
import AjaxService from 'ember-ajax/services/ajax' ;
export default AjaxService . extend ( {
trustedHosts : [ / .example. / , 'foo.bar.com' ]
} ) ;
يمكن استخدام خاصية namespace
لبادئة الطلبات بمساحة اسم عنوان URL محدد.
// 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')
سيستهدف الآن /api/v1/users/me
إذا كنت بحاجة إلى تجاوز مساحة الاسم لطلب مخصص، فاستخدم namespace
كخيار لطرق الطلب.
// GET /api/legacy/users/me
request ( '/users/me' , { namespace : '/api/legacy' } ) ;
يتيح لك ember-ajax
تحديد مضيف لاستخدامه مع الطلب. يعد هذا مفيدًا بشكل خاص حتى لا تضطر إلى تمرير المضيف باستمرار مع المسار، مما يجعل request()
أكثر نظافة قليلاً.
لتضمين مضيف مخصص ليتم استخدامه مع طلباتك، يمكنك تحديد خاصية host
على 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'
} ) ;
يتيح لك ذلك إجراء مكالمة request()
فقط على هذا النحو:
// GET http://api.example.com/users/me
request ( '/users/me' ) ;
يتيح لك ember-ajax
تحديد رأس نوع المحتوى الافتراضي لاستخدامه مع الطلب.
لتضمين نوع محتوى مخصص، يمكنك تحديد خاصية contentType
في 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'
} ) ;
يمكنك أيضًا تجاوز نوع المحتوى لكل request
باستخدام معلمة options
.
تستجيب بعض واجهات برمجة التطبيقات برمز الحالة 200، على الرغم من حدوث خطأ وتوفر رمز الحالة في الحمولة. باستخدام الخدمة، يمكنك بسهولة حساب هذا السلوك عن طريق الكتابة فوق الأسلوب 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
فئات أخطاء مضمنة يمكنك استخدامها للتحقق من الخطأ الذي تم إرجاعه بواسطة الاستجابة. يسمح لك هذا بتقييد تحديد نتيجة الخطأ للخدمة بدلاً من رشها حول الكود الخاص بك.
يحتوي ember-ajax
على أنواع أخطاء مضمنة سيتم إرجاعها من الخدمة في حالة حدوث خطأ:
BadRequestError
(400)UnauthorizedError
(401)ForbiddenError
(403)NotFoundError
(404)InvalidError
(422)ServerError
(5XX)AbortError
TimeoutError
جميع الأخطاء المذكورة أعلاه هي أنواع فرعية من AjaxError
.
يأتي ember-ajax
مزودًا بوظائف مساعدة لمطابقة أخطاء الاستجابة مع نوع خطأ ember-ajax
الخاص بها. كل خطأ من الأخطاء المذكورة أعلاه له دالة مقابلة is*
(على سبيل المثال، isBadRequestError
).
يتم تشجيع استخدام هذه الوظائف بشدة للمساعدة في التخلص من الحاجة إلى رمز الكشف عن الأخطاء المعياري.
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 ;
} ) ;
}
} ) ;
إذا لم تكن أخطائك قياسية، فيمكن استخدام الوظيفة المساعدة لهذا النوع من الأخطاء كأساس لإنشاء وظيفة الكشف المخصصة.
إذا كنت بحاجة إلى الوصول إلى استجابة json لطلب فاشل، فيمكنك استخدام الطريقة raw
بدلاً من request
.
this . get ( 'ajax' )
. raw ( url , options )
. then ( ( { response } ) => this . handleSuccess ( response ) )
. catch ( ( { response , jqXHR , payload } ) => this . handleError ( response ) ) ;
لاحظ أنه في حالة الاستخدام هذه لا يوجد إمكانية الوصول إلى كائن الخطأ. يمكنك فحص كائن jqXHR
للحصول على معلومات إضافية حول الطلب الفاشل. على وجه الخصوص، يقوم jqXHR.status
بإرجاع رمز خطأ HTTP ذي الصلة.
يوفر Ember AJAX مزيجًا يمكن استخدامه في Ember Data Converter لتجنب رمز الشبكة الذي توفره Ember Data والاعتماد على Ember AJAX بدلاً من ذلك. يعد هذا بمثابة خطوة أولى نحو التكامل الحقيقي لـ Ember AJAX في Ember Data.
لاستخدام الميكسين، يمكنك تضمين الميكسين في محول، كما يلي:
// app/adapters/application.js
import DS from 'ember-data' ;
import AjaxServiceSupport from 'ember-ajax/mixins/ajax-support' ;
export default DS . JSONAPIAdapter . extend ( AjaxServiceSupport ) ;
هذا هو كل التكوين المطلوب! إذا كنت تريد تخصيص المحول، مثل استخدام خدمة AJAX بديلة (مثل الخدمة التي قمت بتوسيعها بنفسك)، يتم توفير خطافات للقيام بذلك؛ تحقق من تنفيذ mixin للحصول على التفاصيل.
لاحظ أنه بدلاً من استخدام رمز التحقق من أخطاء Ember Data في تطبيقك، يجب عليك استخدام تلك التي توفرها Ember AJAX.
إذا كنت لا تستخدم Ember Data ولا يمكنك الوصول إلى الخدمات، فيمكنك استيراد أداة ajax المساعدة كما يلي:
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 ;
} ) ;
}
والتي سيكون لها نفس واجهة برمجة التطبيقات مثل خدمة ajax
. إذا كنت تريد كائن jQuery XHR الخام، فيمكنك استخدام الطريقة 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 ;
} ) ;
}
هذه المعلومات ذات صلة فقط إذا كنت تتطلع إلى المساهمة في ember-ajax
.
git clone
هذا المستودعnpm install
ember server
ember test
ember test --server
ember build
لمزيد من المعلومات حول استخدام Ember-cli، قم بزيارة http://www.ember-cli.com/.