没有预检的跨域post json

时间:2016-05-23 21:05:33

标签: javascript cors

我正在尝试将一些json发布到sharepoint网址,例如this示例。该示例使用节点,但我尝试在浏览器中执行此操作。

我首先尝试使用fetch

fetch("https://outlook.office365.com/webhook/...", 
            {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json;'
            },
            body: JSON.stringify(this.groupCardBody()),
        })

从那我得到了错误:

  

对预检请求的响应未通过访问控制检查:否   '访问控制允许来源'标题出现在请求的上   资源。起源' http://localhost:1234'因此不允许访问。如果不透明的回复符合您的需求,请将请求的模式设置为“无人”状态。在禁用CORS的情况下获取资源。

但是我无法控制响应,如果我按照建议将mode: 'no-cors'添加到提取选项中,它会删除content-type标头并返回415 Unsupported Media Type

所以我尝试了一个简单的xhttp请求,并且因为预检而失败,并且没有得到正确的标题:

    let xhr = new XMLHttpRequest()
    xhr.open("POST", "https://outlook.office365.com/webhook/...");
    xhr.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
    xhr.send(JSON.stringify(this.groupCardBody()));
  

对预检请求的响应未通过访问控制检查:否   '访问控制允许来源'标题出现在请求的上   资源。

示例中使用的request库非常难以在浏览器中工作,并且决不是轻量级的(我的webpacked脚本增加了近2MB),因此欢迎任何关于如何绕过这个的建议我很困难,我的所有搜索都找到了修复服务器的答案,而我没有这个选项。

更新

正如在接受的答案中所建议的那样,我通过将json发布回服务器并从那里发帖来解决它,让它使用如下简单的东西:

客户:

fetch("PostGroupCard?json="+
    encodeURI(JSON.stringify(this.groupCardBody())),
    {credentials: "same-origin"}
)

服务器:

Function PostGroupCard(json As String)
    Dim wr = WebRequest.Create("https://outlook.office365.com/webhook/...")
    wr.ContentType = "application/json"
    wr.Method = "POST"

    Using sw = New StreamWriter(wr.GetRequestStream())
        sw.Write(json)
        sw.Flush()
        sw.Close()
    End Using

    Dim r = wr.GetResponse()
    Using sr = New StreamReader(r.GetResponseStream())
        Dim result = sr.ReadToEnd()
    End Using

End Sub

1 个答案:

答案 0 :(得分:0)

大部分答案都来自评论。

出于安全原因,除非您使用相同的来源或来自其他域的CORS标头,否则无法创建XMLHTTPRequest。如果这是可能的,任何网站都可以预先形成恶意行为,例如破解您的帐户。

要考虑的两个备选方案是JSONP,并让您的服务器充当访问其他域的代理。