我有下面的 Javascript 函数。每当我运行它(使用 WebView 从 Android 应用程序调用它)时,它都会作为application/x-www-form-urlencoded
尽管有dataType: "json"
属性。
如果我添加contentType: "application/json; charset=utf-8"
然后甚至没有从服务器收到请求,并且出现错误:
XMLHttpRequest 无法加载https://example.com/api https://example.com/api。响应
预检请求未通过访问控制检查:否
请求中存在“Access-Control-Allow-Origin”标头
资源。因此,不允许访问来源“null”。
请求标头如下所示:
OPTIONS /api HTTP/1.1
Host: example.com
Connection: keep-alive
Access-Control-Request-Method: POST
Origin: null
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36
Access-Control-Request-Headers: content-type
Accept: */*
Accept-Encoding: gzip, deflate, sdch, br
Accept-Language: en-US,en;q=0.8,es;q=0.6
服务器是一个在 Jetty Embedded 上运行的 Java Servlet,它甚至没有 WEB-INF 或 web.xml,因为它不是 Web 应用程序,而是 API。服务器甚至没有收到请求,所以我猜想通过添加也不能解决问题response.addHeader("Access-Control-Allow-Origin", "*");
响应头:
HTTP/1.1 200 OK
Allow: POST, TRACE, OPTIONS
Content-Length: 0
Server: Jetty(9.0.z-SNAPSHOT)
客户端 JavaScript
function create(userId, callback) {
var submitData = {
"action": "create",
"userId": userId
};
$.ajax({
data: JSON.stringify(submitData),
type: "POST",
url: "https://www.example.com/api",
dataType: "json"
})
.done(function(data) { callback(SUCCESS); })
.fail(function() { callback(UNKNOWN_ERROR); });
}
EDIT:尝试在没有 JQuery 的情况下执行此请求,但仍然不起作用。
var xmlhttp = new XMLHttpRequest(); // new HttpRequest instance
xmlhttp.open("POST", "https://www.example.com/api");
xmlhttp.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
xmlhttp.setRequestHeader("Access-Control-Allow-Origin", "*");
xmlhttp.send(JSON.stringify(submitData));