2013-12-09 2 views
0

Salam (означает Hello) :)Как отправить запрос POST API Apache Syncope в node.js?

В моем приложении node.js я пытаюсь добавить пользователя в Apache Syncope через свой RESTful API. Apache Syncope установлен на удаленном VPS и this article демонстрирует этот процесс в среде PHP. вот то, что я сделал в моем Node.js приложения:

http.createServer(onRequest).listen(80); 

function onRequest (request, response) { 
    var options = { 
     hostname: MY_VPS_IP, 
     port: 8080, 
     path: '/syncope/rest/user/create.json', 
     auth: 'admin:password', 
     method: 'POST' 
    }; 
    var data = {an: 'object', of: 'new', user: 'data' }; 

    var req=http.request(options, function(res) { 
     var body; 
     res.on('data', function (chunk) { 
      body += chunk; 
     }); 
     res.on('end', function() { 
      response.writeHead(200, { 'Content-Type': 'text/html' }); 
      response.end(body, 'utf-8'); 
     }); 
    }); 
    req.end(JSON.stringify(data)); 
} 

Ответ Apache обморок ошибка 415 (стили CSS опущены):

undefined 
<html> 
<head><title>Apache Tomcat/7.0.42 - Error report</title> 
</head> 
<body><h1>HTTP Status 415 - </h1> 
<HR size="1" noshade="noshade"> 
<p><b>type</b> Status report</p> 

<p><b>message</b> <u></u></p> 

<p><b>description</b> <u>The server refused this request because the request entity is in a format not supported by the 
    requested resource for the requested method.</u></p> 
<HR size="1" noshade="noshade"> 
<h3>Apache Tomcat/7.0.42</h3></body> 
</html> 
+0

Узел использует кодировку передачи chuncked, которая не поддерживается Syncope здесь. Поскольку вы, вероятно, уже запускаете nginx, просто придерживайтесь этого перед Syncope. – Gant

+0

@ DamonGant Я не знаком с nginx, можете ли вы объяснить, что вы подразумеваете под «прилипанием к тому, что перед Syncope»? Благодарю. –

ответ

1

Node.js будет использовать chuncked кодирование передачи данных для отправка запросов, которая является частью HTTP 1.1. Обход этого внутри Node.js не является желательным, быстрым или элегантным. Общим решением является прокси-сервер несовместимого сервиса, хотя nginx (который будет перекодировать запрос). Вот очень простая примерная конфигурация для обратного проксирования.

server { 
    listen 80; 
    server_name syncope.example.com; 
    proxy_pass http://example.com:8080/; 
    allow 127.0.0.1; # Allow local connections, can be any IP(+CIDR) too 
    deny all; 
} 
+0

Apache Syncope установлен на Apache Tomcat, есть ли способ справиться с этой ситуацией, переконфигурировав Tomcat и без nginx? –

+0

@NasserTorabzade Не знаю, но вы хотите nginx перед своим узловым приложением, а также обслуживать статические файлы или использовать [пассажир] (https://github.com/phusion/passenger/wiki/Phusion-Passenger:-Node.js -руководство) – Gant

Смежные вопросы