Wiremock跨域资源共享(CORS)不起作用。

10

我已经有效地使用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无法工作?

提前感谢。


你在做什么样的请求?如果不是 GET 请求,你需要实现一个带有一些 CORS 头信息的 OPTIONS 存根。 - Tom
@Tom,我正在进行GET和POST请求。你所说的“使用一些CORS头实现OPTIONS存根”是什么意思? - johncougar
CORS协议要求浏览器在发出符合特定标准的请求之前进行OPTIONS“预检”请求以检查允许执行的操作。值得查看 https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Preflighted_requests - Tom
这个问题已经解决了吗?如果是的话,你是怎么让它工作的?我为OPTIONS请求打了一个存根。但它没有执行我想要的POST请求。 - Phil Kearney
5个回答

6

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

  • 独立示例:
java -jar wiremock-jre8-standalone-2.31.0.jar --port 8081 --enable-stub-cors
  • Docker 示例:
docker run -it --rm -p 8081:8080 --name wiremock-yadoms -v $PWD:/home/wiremock wiremock/wiremock --enable-stub-cors

5
我刚刚成功解决了这个问题。实际上,解决方案已经在这里 Adding headers to Jetty in Wiremock

因为您的浏览器在进行任何实际请求之前会发送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头中包含的相同值Request header field Access-Control-Allow-Headers is not allowed by itself in preflight response
所有您的响应也必须发送回头信息"Access-Control-Allow-Origin": "*"

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时,空格有些特殊。在这里,我使用了单个空格而不是制表符。希望对您有所帮助。

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合同,它会更有用)。


0

对于 Angular 开发者:
首先使用以下命令安装 WireMock:

npm install wiremock

然后:

    "scripts": {
            "ng": "ng",
            "start": "ng serve",
            "wiremock": "wiremock --root-dir ./wiremock --port 8080 --enable-stub-cors true --enable-browser-proxying",
        
        ...
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接