- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在开发一项新服务,我在 C++ 应用程序中构建了一个 REST API。 C++ 应用程序监听特定端口并接收 HTTP/S 流量,处理发送的内容,然后发回 HTTP 响应。
我的想法是,我将拥有能够在 C++ API 中发布 REST API 的不同库。我可以从任何地方和任何地方收到请求,所以它可能是另一种软件,例如通过 CURL,或者来自浏览器的 POST 请求。
在我开发一个将与 Javascript 一起使用以通过 AJAX 帖子发送 C++ API 请求的库之前,API 一直在工作。
因为我正在从一个网站向另一个域发送 AJAX 帖子,所以我必须使用 CORS。当我第一次开始设计这个时,我使用的是 Chrome,我遇到了一个问题,即 Chrome 会发送一个 HTTP OPTIONS 请求,而我会以 403 方法不允许作为响应,因为我当时并不知道这一点。我对此进行了调查,发现需要什么,然后让它开始工作,这样 Chrome 就会发送 OPTIONS 请求,C++ 应用程序会发送 200 OK,然后 Chrome 随后会发送实际的 AJAX POST。
这在 Chrome 中完全有效,但是,在 Internet Explorer 和 Firefox 中测试时,浏览器发送 OPTIONS,C++ 应用程序发回 200 OK,但随后两个浏览器都没有发送实际的 POST 请求。
以下是来自 Chrome 和 Firefox 的请求 header 和响应 header 。
Chrome 请求 header
Request URL: http://192.168.1.96:500/initialise
Request Method: OPTIONS
Remote Address: 192.168.1.96:500
Referrer Policy: no-referrer-when-downgrade
Provisional headers are shown
Access-Control-Request-Headers: authorisation-token,device_id,session_id
Access-Control-Request-Method: POST
Origin: http://localhost
User-Agent: Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Mobile Safari/537.36
Chrome 响应 header
Access-Control-Allow-Headers: *
Access-Control-Allow-Methods: POST, OPTIONS
Access-Control-Allow-Origin: *
Access-Control-Expose-Headers: session_id
Allow: POST,OPTIONS
Content-Length: 0
Content-Type: application/json
Status Code: 200 OK
Firefox 请求 header
Accept: text/html,application/xhtml+xm…plication/xml;q=0.9,*/*;q=0.8
Accept-Encoding gzip, deflate
Accept-Language: en-GB,en;q=0.5
Access-Control-Request-Headers: authorisation-token,device_id,session_id
Access-Control-Request-Method: POST
Connection: keep-alive
Host: 192.168.1.96:500
Origin: http://localhost
Referer: http://localhost/_js/
User-Agent: Mozilla/5.0 (Windows NT 10.0; …) Gecko/20100101 Firefox/64.0
Request URL:http://192.168.1.96:500/initialise
Request method:OPTIONS
Remote address:192.168.1.96:500
Firefox 响应 header
Access-Control-Allow-Headers: *
Access-Control-Allow-Methods: POST, OPTIONS
Access-Control-Allow-Origin: *
Access-Control-Expose-Headers: session_id
Allow: POST,OPTIONS
Content-Length: 0
Content-Type: application/json
Status code:200
下面是我如何处理 ajax 请求的引用:
var url = "http://192.168.1.96:500/";
url += api_endpoint;
$.ajax({
type: "POST",
url: url,
async: true,
headers: {
"authorisation-token": app.api_key,
"session_id": app.cookie,
"device_id": app.device_id
},
data: postArray,
crossDomain: true,
success: function(object, status, xhr){
if (api_endpoint === "initialise")
{
app.cookie = xhr.getResponseHeader("session_id");
setCookie("session_id", app.cookie, true);
}
if (callbackResult !== null)
{
callbackResult(object);
}
},
error: function(xhr)
{
console.error("Status: " + xhr.status);
console.error("Status Text:" + xhr.statusText);
console.error("Response Text: " + xhr.responseText);
if (callbackResult !== null)
{
callbackResult(xhr);
}
}
});
我正在使用 Jquery 执行 ajax 发布。
谁能看出为什么在这种情况下 Firefox 不会在 200 OK 之后发送实际请求,请求和响应看起来是一样的,这在 Google Chrome 中完美运行。
最佳答案
感谢@Manoj Purohit 的评论,我已经想通了,可以再次检查控制台。我这样做了,发现有一些警告已被过滤,我必须添加以下 header 以使其在 Firefox 和 Internet 中工作——奇怪的是它在 Chrome 中被接受。
this->addHeader("Access-Control-Allow-Headers", "authorisation-token, device_id, session_id");
关于http - Firefox 和 Internet Explorer 在 OPTIONS 请求后收到 200 OK 后不发送 POST 请求 - 在 Chrome 中工作正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53806487/
我经常使用 var options = options || {} 作为默认为空对象的方式。它通常用于初始化选项对象,以防它未在函数调用的参数中传递。 问题是我在几个地方(博客文章、源代码)读到opt
我是Python中Rust的新手。这是我学习Rust的第四天。 在第一个问题Type casting for Option type之后,我有一个跟语法match和所有权概念有关的后续问题。 首先,我
我正在学习 Ray Wenderlich。我遇到了闭包语法错误。我想知道 Xcode 提示是什么意思? Xcode 报告如下: /Users/.../FlickrPhotosViewControlle
使用 Python 编写命令行界面 (CLI) 时 click library , 是否可以定义例如三个选项,其中仅当第一个(可选)未设置时才需要第二个和第三个选项? 我的用例是一个登录系统,它允许我
我有一个这样的 JPA 查询。 PersonRepository.java public Optional> findByStatus(int status); 人员服务.java System.ou
我遇到了很多地方,我有类似的东西 def f(s: String): Option[Long] = ... def g(l: Long): IO[Option[Wibble]] = ... val a
我有一个results: List[Future[Option[T]]]其中包含(并行)计算。 我想获得第一个非None尽快出结果,或者返回None如果所有计算都返回 None . 目前,我正在这样做
我正在尝试加载一个简单的 Listbox组件来自 @headlessui/react . 选择.tsx type Option = { id: number name: string
如何将Future[Option[Future[Option[X]]]]转换为Future[Option[X]]? 如果它是 TraversableOnce 而不是 Option 我会使用 Futur
Haskell、Rust 等语言提供了一个 Maybe 或 Option 类型。即使在 Java 中,也有一个 Optional 现在打字。 为简单起见,我将在剩下的问题中将此类型称为“选项类型”。
当我尝试在 SQL 中存储一个 XML 而不是一个空元素时,SQL 只是更改它并仅使用一个元素标签来存储它。例如,要存储的 XML 是: ROGER 然后Sql存起来就好了
使用这个非常好的命令行解析器 Argo(仅 header C++ 库)我遇到了一个小问题。请参阅:https://github.com/phforest/Argo Argo 返回:'Error: Un
我是来自 Java 背景的 Scala 新手,目前对考虑 Option[T] 的最佳实践感到困惑. 我觉得用 Option.map只是更实用和美观,但这不是说服其他人的好理由。有时, isEmpty
这个问题在这里已经有了答案: Chaining Optionals in Java 8 (9 个回答) Optional orElse Optional in Java (6 个回答) Functio
Optional::stream如果存在,则返回一个包含该值的 Stream,否则返回一个空流。所以对于 Stream> optionals , optionals.flatMap(Optional:
我使用箭头键作为输入,在 printf 菜单中上下移动 printf 箭头(“==>”)。 我正在使用一个函数来计算箭头应该在的位置,并使用 switch case 和 printf("\n==>")
这个问题在这里已经有了答案: What does the construct x = x || y mean? (12 个答案) 关闭 9 年前。 如我的问题标题所述,我最近偶然发现了这个变量声明:
这个问题在这里已经有了答案: BackboneJS: What is options || (options = {}); in Backbone source code (1 个回答) 关闭 8
我有这个简单的语法: word = Word(alphanums + '_') with_stmt = Suppress('with') + OneOrMore(Group(word('key') +
使用 Cucumber 和 SitePrism 编写测试,我在页面上有以下 HTML... Select a Status Active Product Inactive Prod
我是一名优秀的程序员,十分优秀!