为什么GM_xmlhttpRequest忽略其数据参数?

时间:2013-02-12 20:56:01

标签: post greasemonkey gm-xmlhttprequest

根据its documentationGM_xmlhttpRequest应该能够将data参数作为其参数的一部分。

然而,我似乎无法让它发挥作用。

我有一个简单的服务器,它回应给它的参数:

require 'sinatra'
require 'json'
get '/' do
  JSON.dump params
end
post '/' do
  JSON.dump params
end

一个简单的greasemonkey脚本,只是尝试将一些数据发送到服务器。 它尝试将数据作为查询参数传递到URL和postdata:

// ==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);
});

当我使用jQuery POST postdata时,它工作正常,但是使用GM_xmlhttpRequest POST的任何postdata都会被忽略:

jq:{"q0":"0","q1":"1","d0":"0","d1":"1"}
gm:{"q0":"0","q1":"1"}

这让我相信GM_xmlhttpRequest实际上并没有使用我提供的data参数。 (我不确定b / c我无法监控Firebug中GM_xmlhttpRequest的网络活动。)

这里发生了什么?我搞砸了什么? API转移了吗?如何使用GM_xmlhttpRequest发布数据而不将其打包到URL中?

1 个答案:

答案 0 :(得分:3)

好的,我使用TamperData firefox add-on来监控我的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的{​​{1}},这可以让它发挥作用。

GM_xmlhttpRequest