Skip to content

Commit bc32051

Browse files
committed
Adding own default headers and per-request headers is now possible, extended readme
1 parent 5fa0305 commit bc32051

File tree

3 files changed

+119
-14
lines changed

3 files changed

+119
-14
lines changed

README.md

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,3 +107,39 @@ WebApiClient.Delete(request)
107107
// Handle error
108108
});
109109
```
110+
111+
## Headers
112+
113+
### Header Format
114+
Headers are represented as objects containing a key and a value property:
115+
116+
```JavaScript
117+
var header = { key: "headerKey", value: "headerValue" };
118+
```
119+
120+
### Default Headers
121+
By default there is a defined set of default headers, that will be sent with each request.
122+
You can however manipulate the default headers by accessing the WebApiClient.DefaultHeaders array property.
123+
124+
### Request Headers
125+
You can also attach headers per request, all request parameters have a headers property, that can be used for passing per-request headers.
126+
127+
This could look something like this:
128+
``` JavaScript
129+
// Parameters for create request
130+
var request = {
131+
entityName: "account",
132+
entity: {name: "Adventure Works"},
133+
headers: [ { key: "headerKey", value: "headerValue" }]
134+
};
135+
136+
Note: Currently your request headers are simply added after the default headers. Watch out for interferences.
137+
```
138+
139+
### API Version
140+
The default API version is 8.0.
141+
You can however change it to 8.1 if needed by using
142+
143+
```JavaScript
144+
WebApiClient.SetApiVersion("8.1");
145+
```

src/js/WebApiClient.js

Lines changed: 56 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
(function (WebApiClient, undefined) {
2626
var Promise = require("bluebird");
2727

28-
var apiVersion = "8.0";
28+
var ApiVersion = "8.0";
2929

3030
function GetCrmContext() {
3131
if (typeof (GetGlobalContext) !== "undefined") {
@@ -53,8 +53,12 @@
5353
return id.replace("{", "").replace("}", "");
5454
}
5555

56+
WebApiClient.GetApiVersion = function() {
57+
return ApiVersion;
58+
};
59+
5660
WebApiClient.SetApiVersion = function(version) {
57-
apiVersion = version;
61+
ApiVersion = version;
5862
};
5963

6064
WebApiClient.GetSetName = function (entityName) {
@@ -71,8 +75,50 @@
7175
}
7276
};
7377

78+
var DefaultHeaders = [
79+
{ key: "Accept", value: "application/json" },
80+
{ key: "OData-Version", value: "4.0" },
81+
{ key: "OData-MaxVersion", value: "4.0" },
82+
// Prevent caching since it sometimes sends old data as unmodified
83+
{ key: "If-None-Match", value: null }
84+
];
85+
86+
WebApiClient.GetDefaultHeaders = function() {
87+
return DefaultHeaders;
88+
};
89+
90+
function VerifyHeader(header) {
91+
if (!header.key || typeof(header.value) === "undefined") {
92+
throw "Each request header needs a key and a value!";
93+
}
94+
}
95+
96+
WebApiClient.AppendToDefaultHeaders = function () {
97+
if (!arguments) {
98+
return;
99+
}
100+
101+
for(var i = 0; i < arguments.length; i++) {
102+
var argument = arguments[i];
103+
104+
DefaultHeaders.push(arguments[i]);
105+
}
106+
};
107+
108+
function AppendHeaders(xhr, headers) {
109+
if (headers) {
110+
for (var i = 0; i < headers.length; i++) {
111+
var header = headers[i];
112+
113+
VerifyHeader(header);
114+
115+
xhr.setRequestHeader(header.key, header.value);
116+
}
117+
}
118+
}
119+
74120
// Private function
75-
function SendRequest (method, url, payload) {
121+
function SendRequest (method, url, payload, requestHeaders) {
76122
var xhr = new XMLHttpRequest();
77123

78124
var promise = new Promise(function(resolve, reject) {
@@ -104,20 +150,16 @@
104150

105151
xhr.open(method, url, true);
106152

107-
xhr.setRequestHeader("Accept", "application/json");
108-
xhr.setRequestHeader("OData-Version", "4.0");
109-
xhr.setRequestHeader("OData-MaxVersion", "4.0");
110-
111-
// Prevent caching since it sometimes sends old data as unmodified
112-
xhr.setRequestHeader("If-None-Match", null);
153+
AppendHeaders(xhr, WebApiClient.DefaultHeaders);
154+
AppendHeaders(xhr, requestHeaders);
113155

114156
xhr.send(JSON.stringify(payload));
115157

116158
return promise;
117159
}
118160

119161
WebApiClient.GetApiUrl = function() {
120-
return GetClientUrl() + "/api/data/v" + apiVersion + "/";
162+
return GetClientUrl() + "/api/data/v" + ApiVersion + "/";
121163
};
122164

123165
WebApiClient.Create = function(parameters) {
@@ -129,7 +171,7 @@
129171

130172
var url = WebApiClient.GetApiUrl() + WebApiClient.GetSetName(params.entityName);
131173

132-
return SendRequest("POST", url, params.entity);
174+
return SendRequest("POST", url, params.entity, params.headers);
133175
};
134176

135177
WebApiClient.Retrieve = function(parameters) {
@@ -147,7 +189,7 @@
147189

148190
url += params.queryParams;
149191

150-
return SendRequest("GET", url);
192+
return SendRequest("GET", url, null, params.headers);
151193
};
152194

153195
WebApiClient.Update = function(parameters) {
@@ -159,7 +201,7 @@
159201

160202
var url = WebApiClient.GetApiUrl() + WebApiClient.GetSetName(params.entityName) + "(" + RemoveIdBrackets(params.entityId) + ")";
161203

162-
return SendRequest("PATCH", url, params.entity);
204+
return SendRequest("PATCH", url, params.entity, params.headers);
163205
};
164206

165207
WebApiClient.Delete = function(parameters) {
@@ -171,6 +213,6 @@
171213

172214
var url = WebApiClient.GetApiUrl() + WebApiClient.GetSetName(params.entityName) + "(" + RemoveIdBrackets(params.entityId) + ")";
173215

174-
return SendRequest("DELETE", url);
216+
return SendRequest("DELETE", url, null, params.headers);
175217
};
176218
} (window.WebApiClient = window.WebApiClient || {}));

src/spec/WebApiClientSpec.js

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,4 +222,31 @@ describe("WebApiClient", function() {
222222
xhr.respond();
223223
});
224224
});
225+
226+
describe("Headers", function() {
227+
it("should set default headers", function(){
228+
expect(WebApiClient.GetDefaultHeaders()).toBeDefined();
229+
});
230+
231+
it("should allow to add own default headers", function(){
232+
var testHeader = {key: "newHeader", value: "newValue"};
233+
WebApiClient.AppendToDefaultHeaders (testHeader);
234+
235+
var defaultHeaders = WebApiClient.GetDefaultHeaders();
236+
237+
expect(defaultHeaders[defaultHeaders.length - 1]).toEqual(testHeader);
238+
});
239+
});
240+
241+
describe("API Version", function() {
242+
it("should default to 8.0", function() {
243+
expect(WebApiClient.GetApiVersion()).toEqual("8.0");
244+
});
245+
246+
it("should be editable", function() {
247+
WebApiClient.SetApiVersion("8.1")
248+
249+
expect(WebApiClient.GetApiVersion()).toEqual("8.1");
250+
});
251+
});
225252
});

0 commit comments

Comments
 (0)