7

我已经有效地使用了wiremock 有一段时间了,我想启用CORS 对模拟API 的访问。

我尝试在响应标头中设置 Access-Control-Allow-Origin: * 和其他标头,但均无济于事。

这是我拥有的映射示例:

{
    "request": {
        "method": "POST",
        "urlPattern": "/api/v2/general/login[\\/\\&\\?]*",
        "bodyPatterns": [{
            "equalToJson": "{\"password\":\"password\",\"username\":\"john@cougar.com\"} ",
            "jsonCompareMode": "LENIENT",
            "ignoreArrayOrder" : true,
            "ignoreExtraElements" : true
        }]
    },
    "response": {
        "status": 200,
        "headers": {
            "Content-Type": "application/json",
            "Access-Control-Allow-Origin" : "*",
            "Access-Control-Allow-Methods" : "*",
            "Access-Control-Allow-Headers": "Accept, Content-Type, Content-Encoding, Server, Transfer-Encoding",
            "X-Content-Type-Options" : "nosniff",
            "x-frame-options" : "DENY",
            "x-xss-protection" : "1; mode=block"
        },
        "bodyFileName": "/login_response_johncougar.json"
    }
}

我在这里做错了什么导致CORS不起作用?

提前致谢。

4

4 回答 4

3

我刚刚设法解决了这个问题。实际上,解决方案已经在这里向 Wiremock 中的 Jetty 添加标头

因为您的浏览器会在发出任何实际请求之前发送 CORS 预检请求,所以您需要设置您的 wiremock 以存根 OPTIONS 请求并发送回标头。

例如,
Access-Control-Allow-Origin = "*", Access-Control-Allow-Headers: "content-type", Access-Control-Allow-Methods = "POST, GET"

Access-Control-Allow-Headers 的值必须与包含的 Access-Control-Request-Headers 标头中的值相同请求标头字段 Access-Control-Allow-Headers 本身在预检响应中是不允许的

您的所有回复也必须发回标头"Access-Control-Allow-Origin": "*"

于 2019-01-11T11:09:14.533 回答
3

这是一个示例,这有效

{
 "request":
 {
 "urlPattern": "/country/([a-z]*)",
 "method": "GET"
 },

 "response":
 {
 "status": 200,
 "headers":
 {
 "Content-Type" : "application/json",
 "Access-Control-Allow-Origin" : "*",
 "Access-Control-Allow-Methods" : "*",
 "Access-Control-Allow-Headers": "Accept, Content-Type, Content-Encoding, Server, Transfer-Encoding",
 "X-Content-Type-Options" : "nosniff",
 "x-frame-options" : "DENY",
 "x-xss-protection" : "1; mode=block"
 },
 "body": "{ \"statusCode\" : \"S1000\", \"statusDescription\" : \"Success\", \"content\" : [ { \"id\" : \"1111\", \"name\" : \"aaaa\"}, { \"id\" : \"2222\", \"name\" : \"asd\" } ] }"
 }
}

照原样使用它,wiremock 在间距方面很特殊,这里我使用了单个空格而不是制表符,希望对您有所帮助。

于 2017-07-10T09:53:21.217 回答
2

我有同样的问题。经过很长时间没有找到解决方案,我开始使用 groovy 文件,终于找到了解决方案。

您只需要在 header() 方法中添加每个标题。这将解决问题。因此,您的示例 groovy 合同将如下所示:

{
  "request": {
    "method": "POST",
    "urlPattern": "/api/v2/general/login[\\/\\&\\?]*",
    "bodyPatterns": [{
      "equalToJson": "{\"password\":\"password\",\"username\":\"john@cougar.com\"} ",
      "jsonCompareMode": "LENIENT",
      "ignoreArrayOrder": true,
      "ignoreExtraElements": true
    }]
  },
  "response": {
    "status": 200,
    "headers": {
      header("Content-Type": "application/json"),
      header("Access-Control-Allow-Origin": "*"),
      header("Access-Control-Allow-Methods": "*"),
      header("Access-Control-Allow-Headers": "Accept, Content-Type, Content-Encoding, Server, Transfer-Encoding"),
      header("X-Content-Type-Options": "nosniff"),
      header("x-frame-options": "DENY"),
      header("x-xss-protection": "1; mode=block")
    },
    "bodyFileName": "/login_response_johncougar.json"
  }
}

我希望它能解决您的问题(实际上,如果您使用 groovy 合约,它会很有用)。

于 2018-07-21T05:44:49.367 回答
1

--enable-stub-cors您可以通过添加标志来禁用 cors

  • 独立示例:
java -jar wiremock-jre8-standalone-2.31.0.jar --port 8081 --enable-stub-cors
  • 码头工人示例:
docker run -it --rm -p 8081:8080 --name wiremock-yadoms -v $PWD:/home/wiremock wiremock/wiremock --enable-stub-cors
于 2021-11-27T20:23:47.747 回答