Wiremock CORS не работает

Я уже некоторое время эффективно использую wiremock, и я хотел включить CORS-доступ к фиктивным API.

Я пытался установить Access-Control-Allow-Origin: * и другие заголовки в заголовке ответа, но безрезультатно.

Вот пример отображения, которое у меня есть:

{
    "request": {
        "method": "POST",
        "urlPattern": "/api/v2/general/login[\\/\\&\\?]*",
        "bodyPatterns": [{
            "equalToJson": "{\"password\":\"password\",\"username\":\"[email protected]\"} ",
            "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 не работает?

Заранее спасибо.


person johncougar    schedule 23.02.2017    source источник
comment
Какой запрос вы делаете? Если это что-то другое, кроме GET, вам также нужно будет реализовать заглушку OPTIONS с некоторыми заголовками CORS.   -  person Tom    schedule 24.02.2017
comment
@ Том, я делаю запросы GET и POST. Что вы имели в виду под реализацией заглушки OPTIONS с некоторыми заголовками CORS?   -  person johncougar    schedule 08.03.2017
comment
Протокол CORS требует, чтобы браузеры выполняли предварительный запрос OPTIONS, чтобы проверить, что им разрешено делать, прежде чем делать запрос, соответствующий определенным критериям. Стоит взглянуть на developer.mozilla.org/en-US. /docs/Интернет/HTTP/   -  person Tom    schedule 09.03.2017
comment
Было ли это исправлено, если да, то как вы заставили его работать? Я заглушил запрос на запрос OPTIONS. Но это не делает POST, который я хочу после него.   -  person Phil Kearney    schedule 14.04.2017


Ответы (3)


Мне только что удалось исправить эту проблему. На самом деле решение уже было здесь Добавление заголовков в Jetty в 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, содержащий Поле заголовка запроса Access-Control-Allow-Headers само по себе не разрешено в предварительном ответе.

Все ваши ответы также должны отправляться обратно с заголовком "Access-Control-Allow-Origin": "*".

person Alan Ho    schedule 11.01.2019

Вот пример, и это работает

{
 "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 своеобразен, когда дело доходит до интервалов, здесь я использовал один пробел вместо табуляции, надеюсь, это поможет.

person Saahithyan Vigneswaran    schedule 10.07.2017

У меня такая же проблема. После долгих поисков, не найдя решения, я начал играть с заводным файлом и, наконец, нашел решение.

Вам просто нужно добавить каждый заголовок в метод header(). это решит проблему. Таким образом, ваш пример заводского контракта будет таким:

{
  "request": {
    "method": "POST",
    "urlPattern": "/api/v2/general/login[\\/\\&\\?]*",
    "bodyPatterns": [{
      "equalToJson": "{\"password\":\"password\",\"username\":\"[email protected]\"} ",
      "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"
  }
}

Я надеюсь, что это решит вашу проблему (на самом деле это будет полезно, если вы используете заводные контракты).

person hossein shemshadi    schedule 21.07.2018