gitlab-org--gitlab-foss/doc/development/fe_guide/vue_resource.md

2.5 KiB

Vue Resouce

In Vue applications we use vue-resource to communicate with the server.

HTTP Status Codes

.json()

When making a request to the server, you will most likely need to access the body of the response. Use .json() to convert. Because .json() returns a Promise the follwoing structure should be used:

service.get('url')
  .then(resp => resp.json())
  .then((data) => {
    this.store.storeData(data);
  })
  .catch(() => new Flash('Something went wrong'));

When using Poll (app/assets/javascripts/lib/utils/poll.js), the successCallback needs to handle .json() as a Promise:

successCallback: (response) => {
  return response.json().then((data) => {
    // handle the response
  });
}

204

Some endpoints - usually delete endpoints - return 204 as the success response. When handling 204 - No Content responses, we cannot use .json() since it tries to parse the non-existant body content.

When handling 204 responses, do not use .json, otherwise the promise will throw an error and will enter the catch statement:

  Vue.http.delete('path')
    .then(() => {
      // success!
    })
    .catch(() => {
      // handle error
    })

Headers

Headers are being parsed into a plain object in an interceptor. In Vue-resource 1.x headers object was changed into an Headers object. In order to not change all old code, an interceptor was added.

If you need to write a unit test that takes the headers in consideration, you need to include an interceptor to parse the headers after your test interceptor. You can see an example in spec/javascripts/environments/environment_spec.js:

import { headersInterceptor } from './helpers/vue_resource_helper';

beforeEach(() => {
  Vue.http.interceptors.push(myInterceptor);
  Vue.http.interceptors.push(headersInterceptor);
});

afterEach(() => {
  Vue.http.interceptors = _.without(Vue.http.interceptors, myInterceptor);
  Vue.http.interceptors = _.without(Vue.http.interceptors, headersInterceptor);
});

CSRF token

We use a Vue Resource interceptor to manage the CSRF token. app/assets/javascripts/vue_shared/vue_resource_interceptor.js holds all our common interceptors. Note: You don't need to load app/assets/javascripts/vue_shared/vue_resource_interceptor.js since it's already being loaded by common_vue.js.