1

根据其文档GM_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 发布 postdata 时,它工作正常,但我使用的任何 postdata 都会GM_xmlhttpRequest被忽略:

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

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

这里发生了什么?我搞砸了什么吗?API是否发生了变化?如何GM_xmlhttpRequest在不将数据打包到 URL 的情况下发布数据?

4

1 回答 1

3

好的,我使用TamperData firefox 插件来监控我的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-Typemy 的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);
});
于 2013-02-12T21:19:55.590 回答