У меня есть restify, настроенный следующим образом:
var restify = require('restify');
const server = restify.createServer();
//server.use(restify.plugins.acceptParser(server.acceptable)); // [1]
server.use(restify.plugins.queryParser());
server.use(restify.plugins.bodyParser());
server.use(function(req, res, next) {
console.log(req); // <-- Never see the POST from React here
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Headers', '*');
res.setHeader('Access-Control-Allow-Methods', '*');
next();
});
Я определяю кучу маршрутов GET
и POST
, и пока все работает отлично. Я вызывал сервер из Android-приложения, скриптов Python и для тестирования просто использовал curl
. Никаких проблем. Аккуратный!
Однако теперь я реализовал веб-приложение с помощью React и хочу сделать запрос к API восстановления с помощью пакета axios
. GET
запросы в порядке, поэтому я исключаю любые опечатки в URL или подобные вещи.
Но запрос POST, подобный следующему, не будет работать:
var data = {"test": "hello"};
axios.post("http://.../api/v1/message/question/public/add", data)
.then(function (response) {
console.log("Test question sent!");
})
.catch(function (error) {
console.log(error);
});
Когда я проверяю инструменты разработчика браузера, я вижу, что браузер пытается сделать запрос OPTIONS
(а не POST
) к этому URL-адресу. Я предполагаю, из того, что я прочитал, это потому, что браузер делает «предварительный запрос». Проблема в том, что я получаю ошибку 405 Method Not Allowed
:
Request URL: http://.../api/v1/message/question/public/add
Request method: OPTIONS
Remote address: ...
Status code: 405 Method Not Allowed
Response headers (178 B)
Server: restify
Allow: POST
Content-Type: application/json
Content-Length: 62
Date: Sat, 09 Sep 2017 08:16:32 GMT
Connection: keep-alive
Request headers (485 B)
Host: ...
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linu…) Gecko/20100101 Firefox/55.0
Accept: text/html,application/xhtml+xm…plication/xml;q=0.9,*/*;q=0.8
Accept-Language: en-ZA,en-GB;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Access-Control-Request-Method: POST
Access-Control-Request-Headers: content-type
Origin: http://...
DNT: 1
Connection: keep-alive
Но почему? Я разрешаю все Access-Control-Allow-Methods
в restify. Все работает, кроме POST
запросов и только тогда, когда они приходят из браузера (с веб-приложением React). Я думаю, это из-за запроса OPTIONS
, но я понятия не имею, как с этим справиться.
Кстати с JSON.stringify(data)
запросы POST
проходят, но API ожидает Json а не строку. А так как со всеми другими средствами он работает отлично, я не хочу менять код переустановки только для решения этой проблемы.
[1] Если я использую эту строку, я получаю следующую ошибку: AssertionError [ERR_ASSERTION]: acceptable ([string]) is required at Object.acceptParser (/home/bob/node_modules/restify/lib/plugins/accept.js:30:12)