Javascript 向外部站点提交一个表单,该站点希望json数据作为帖子正文

Javascript 向外部站点提交一个表单,该站点希望json数据作为帖子正文,javascript,json,forms,Javascript,Json,Forms,我需要在一个外部站点上模拟提交表单,我已经让它在其他站点上运行,但是现在外部站点需要json格式的值作为参数,这很难实现 在服务器期望json之前,我已经将其完美地用于此(注意javascript模拟提交表单,并且表单编码为与外部站点相关): 但是,这种方法给我带来了与“访问控制允许来源”相关的其他几个问题,我不会解决这些问题,因为我不拥有要发布到的服务器 那么,有谁能提供更好的方法来向外部服务器发布json帖子(或发布正文)?这个答案发布于2014年;从那时起,情况发生了很大的变化,现在这个答

我需要在一个外部站点上模拟提交表单,我已经让它在其他站点上运行,但是现在外部站点需要json格式的值作为参数,这很难实现

在服务器期望json之前,我已经将其完美地用于此(注意javascript模拟提交表单,并且表单编码为与外部站点相关):

但是,这种方法给我带来了与“访问控制允许来源”相关的其他几个问题,我不会解决这些问题,因为我不拥有要发布到的服务器

那么,有谁能提供更好的方法来向外部服务器发布json帖子(或发布正文)?

这个答案发布于2014年;从那时起,情况发生了很大的变化,现在这个答案多少有些无关紧要了。
如果服务器需要一个JSON负载,并且它可以从hurl.it运行,那么您可能没有CORS问题

$.post本身无法设置内容类型标题;您需要使用父级
$.ajax
,并确保发布了正确的JSON负载(尝试将
dat
记录到控制台并对照它进行检查)

您的示例还有几个语法错误,例如
document.login\u form
缺少引号,以及格式不正确的
$.post

尝试清理它:

var frm = $('document.login_form');
data = JSON.stringify(frm.serializeArray());

$.ajax(frm.attr("action"), {
    type: "POST",
    data: data,
    contentType: "application/json; charset=utf-8",
    dataType: "json"
}, function (data) {
    console.log(data);
});
  • 您不能使用表单提交
    应用程序/json
  • 无法使用JavaScript从其他来源读取响应(除非该来源授予权限)

剩下的唯一选项是让表单或JavaScript将数据发送到其他地方(由您控制)并让服务器负责处理其他地方向您想要联系的服务器发出自己的HTTP请求,然后将响应转发回浏览器。

$中的
数据类型
参数。post
指定服务器返回的数据类型,而不是它期望的数据类型。@Barmar Right,抱歉,我从不使用$.post,只使用$.ajax。这和
$.ajax
是一样的。是的,但是你不能用$.post设置
contentType
?或者你能吗?我总是像那里更新的例子一样设置它,显然,在这两个地方,它都发送和请求JSON。没错,你不能在
$.post
中指定大多数AJAX参数,除非在前面调用
$.ajaxSetup
。你真的确定服务器需要JSON表单数据吗?浏览器从不以这种格式发送表单输入。浏览器通常支持的唯一格式是
x-www-form-urlencoded
(与URL查询字符串的格式相同)或
multipart/form data
(类似于多部分电子邮件正文)。
     function load()
     {
         var frm = $(document.login_form);
         dat = JSON.stringify(frm.serializeArray());
         alert("I am about to POST this:\n\n" + dat);

         $.post(
                 frm.attr("action"),
                 dat,
                 function(data) {
                     alert("Response: " + data);
                     }
                 );

     //window.document.login_form.submit();
     return;
 } 
var frm = $('document.login_form');
data = JSON.stringify(frm.serializeArray());

$.ajax(frm.attr("action"), {
    type: "POST",
    data: data,
    contentType: "application/json; charset=utf-8",
    dataType: "json"
}, function (data) {
    console.log(data);
});