diff --git a/datasette/templates/api_explorer.html b/datasette/templates/api_explorer.html
index 21ef3651..a845482a 100644
--- a/datasette/templates/api_explorer.html
+++ b/datasette/templates/api_explorer.html
@@ -65,6 +65,24 @@ var getForm = document.getElementById('api-explorer-get');
var output = document.getElementById('output');
var errorList = output.querySelector('.errors');
+// On first load, populate forms from # in URL, if present
+if (window.location.hash) {
+ var hash = window.location.hash.slice(1);
+ // Treat hash as a foo=bar string and parse it:
+ var params = new URLSearchParams(hash);
+ var method = params.get('method');
+ if (method == 'GET') {
+ getForm.closest('details').open = true;
+ postForm.closest('details').open = false;
+ getForm.querySelector('input[name="path"]').value = params.get('path');
+ } else if (method == 'POST') {
+ postForm.closest('details').open = true;
+ getForm.closest('details').open = false;
+ postForm.querySelector('input[name="path"]').value = params.get('path');
+ postForm.querySelector('textarea[name="json"]').value = params.get('json');
+ }
+}
+
// Cause GET and POST regions to toggle each other
var getDetails = getForm.closest('details');
var postDetails = postForm.closest('details');
@@ -82,6 +100,10 @@ postDetails.addEventListener('toggle', (ev) => {
getForm.addEventListener("submit", (ev) => {
ev.preventDefault();
var formData = new FormData(getForm);
+ // Update URL fragment hash
+ var serialized = new URLSearchParams(formData).toString() + '&method=GET';
+ window.history.pushState({}, "", location.pathname + '#' + serialized);
+ // Send the request
var path = formData.get('path');
fetch(path, {
method: 'GET',
@@ -103,6 +125,10 @@ getForm.addEventListener("submit", (ev) => {
postForm.addEventListener("submit", (ev) => {
ev.preventDefault();
var formData = new FormData(postForm);
+ // Update URL fragment hash
+ var serialized = new URLSearchParams(formData).toString() + '&method=POST';
+ window.history.pushState({}, "", location.pathname + '#' + serialized);
+ // Send the request
var json = formData.get('json');
var path = formData.get('path');
// Validate JSON