axios 1.0.0 stop exporting utils in its lib
directory, it only exporting its axios class now.
It will be painfully for me to maintain this adapter for axios>=1.0.0.
Consider to use a fetch api provided by https://github.com/trim21/gm-fetch
An adapter for axios to make ajax calls within UserScript via the GM.xmlHttpRequest function as provided by the Greasemonkey and Tampermonkey WebExtensions for Firefox and Chromium-based browsers.
// ==UserScript==
// @name new user script
// @namespace https://trim21.me/
// @description hello
// @version 0.0.1
// @author Trim21 <[email protected]>
// @match http*://*/*
// @require https://cdn.jsdelivr.net/npm/[email protected]/dist/axios.min.js
// @require https://cdn.jsdelivr.net/npm/[email protected]
// @grant GM.xmlHttpRequest
// @run-at document-end
// @connect httpbin.org
// ==/UserScript==
console.log(axios.defaults.adapter);
axios.defaults.adapter = axiosGmxhrAdapter;
axios.get("https://httpbin.org/headers").then((res) => console.log(res.data));
The axios documentation describes axios adapters as
modules that handle dispatching a request and settling a returned Promise once a response is received.
The standard axios distribution includes adapters for the browser via xmlHttpRequest
, and node.js via http
and https
.
Custom adapters are typically used for 'mocking' requests for testing purposes, such as axios-mock-adapter.
axios-userscript-adapter
is specifically for using axios in the browser.
Chiefly, in userscript where the xmlHttpRequest
function for making ajax requests is replaced with GM.xmlHttpRequest
.
GM.xmlHttpRequest
is a privileged function available within the Greasemonkey and Tampermonkey
webextensions that allow userscripts to make ajax requests that cross same origin policy boundaries.
In other words, using axios, the userscript can make http requests to sites that didn't originate from the currently loaded web page.
Read the GM.xmlHttpRequest function wiki page for further details.
After assigning axios-userscript-adapter
as the default adapter:
var axios = require("axios");
var adapter = require("axios-userscript-adapter");
axios.defaults.adapter = adapter;
all the usual axios goodness is available within your userscript.
axios-userscript-adapter
requires axios 0.21.0 or higher
add // @grant GM.xmlHttpRequest
to your userscript metadata
If you are using older version, you may grant GM_xmlhttpRequest
npm install axios axios-userscript-adapter
As previously shown, you can set axios-userscript-adapter
as the default adapter,
in which case, all axios requests will be dispatched via GM.xmlHttpRequest
.
However, you can instead specify the adapter on individual requests via a config
object.
console.log(axios.defaults.adapter);
axios.defaults.adapter = axiosGmxhrAdapter;
axios.get("https://httpbin.org/headers");
Example with webpack:
var axios = require("axios");
var adapter = require("axios-userscript-adapter");
// Send a POST request using GM.xmlHttpRequest
axios({
method: "post",
url: "https://www.different-server.com/user/12345",
data: {
firstName: "Fred",
lastName: "Flintstone",
},
adapter: adapter,
});
or via any requests made by an instance:
var axios = require("axios");
var adapter = require("axios-userscript-adapter");
var instance = axios.create({
// `url` is the server URL that will be used for the request
url: "https://www.different-server.com/user",
// `method` is the request method to be used when making the request
method: "post",
// `adapter` allows custom handling of requests which makes testing easier.
// Return a promise and supply a valid response.
adapter: adapter,
});
// Send a POST request using GM.xmlHttpRequest
instance.request({
data: {
firstName: "Fred",
lastName: "Flintstone",
},
});
esm is also supported:
import adapter from "axios-userscript-adapter";
axios-userscript-adapter
is forked from axios-gmxhr-adapter
MIT