Почему GM_xmlhttpRequest игнорирует свой параметр данных?
Согласно его документации, GM_xmlhttpRequest
должен быть в состоянии принять data
параметр как часть его аргумента.
Тем не менее, я не могу заставить его работать.
У меня есть простой сервер, который отражает параметры, данные ему:
require 'sinatra'
require 'json'
get '/' do
JSON.dump params
end
post '/' do
JSON.dump params
end
И простой скрипт greasemonkey, который просто пытается отправить некоторые данные на сервер. Он пытается передать данные в качестве параметров запроса в URL и в качестве постданных:
// ==UserScript==
// @name PostDataTest
// @namespace Test
// @description Simple test of GM_xmlhttpRequest's data parameter
// @include http://localhost:4567/
// @version 1
// @require http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js
// @grant metadata
// @grant GM_xmlhttpRequest
// ==/UserScript==
var url = '/?q0=0&q1=1';
var data = 'd0=0&d1=1'
GM_xmlhttpRequest({ method: 'POST', url: url, data: data, onload: function(r){
console.log('gm:' + r.responseText);
}});
$.post(url, data, function(d,s,r){
console.log('jq:' + r.responseText);
});
Когда я POST постданных с помощью jQuery, он работает нормально, но любые постданные я POST с помощью GM_xmlhttpRequest
игнорируется:
jq:{"q0":"0","q1":"1","d0":"0","d1":"1"}
gm:{"q0":"0","q1":"1"}
Это заставляет меня верить, что GM_xmlhttpRequest
на самом деле не использует data
параметр я даю. (Я не уверен, что б / к я не могу контролировать GM_xmlhttpRequest
Сетевая активность в Firebug).
Что тут происходит? Я что-то напортачил? API сдвинулся? Как я могу использовать GM_xmlhttpRequest
разместить данные без упаковки в URL?
1 ответ
Хорошо, я использовал дополнение Firefox TamperData для мониторинга моего GM_xmlhttpRequests
(которые отправляли postdata), чтобы увидеть, что они делают по-другому.
Разница была в четырех заголовках. Куда отправил jQuery
Accept: */*
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
Referer: http://localhost:4567/
GM_xmlhttpRequest
послал:
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Content-Type: text/plain; charset=UTF-8
С использованием headers:
Параметр я смог указать Content-Type
из моего GM_xmlhttpRequest
, который получил его на работу.
// ==UserScript==
// @name PostDataTest
// @namespace Test
// @description Simple test of GM_xmlhttpRequest's data parameter
// @include http://localhost:4567/
// @version 1
// @require http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js
// @grant metadata
// @grant GM_xmlhttpRequest
// ==/UserScript==
var url = '/?q0=0&q1=1';
var data = 'd0=0&d1=1'
GM_xmlhttpRequest({
method: 'POST',
url: url+'gm',
data: data+'gm',
headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' },
onload: function(r){
console.log('gm:' + r.responseText);
}});
$.post(url+'jq', data+'jq', function(d,s,r){
console.log('jq:' + r.responseText);
});