我正在尝试将一些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
答案 0 :(得分:0)
大部分答案都来自评论。
出于安全原因,除非您使用相同的来源或来自其他域的CORS标头,否则无法创建XMLHTTPRequest。如果这是可能的,任何网站都可以预先形成恶意行为,例如破解您的帐户。
要考虑的两个备选方案是JSONP,并让您的服务器充当访问其他域的代理。