首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CURL - NodeJS Rest调用Imperva - [SyntaxError:意外令牌<]

CURL - NodeJS Rest调用Imperva - [SyntaxError:意外令牌<]
EN

Stack Overflow用户
提问于 2016-06-20 23:16:20
回答 1查看 751关注 0票数 0

我编写了一个shell脚本代码,它成功地在Imperva系统/实例中添加了一个新的OS连接IP。

代码语言:javascript
复制
## Create a new IP OS connection in a given site, server group.
create_ip()
{
 JSESSIONID="${1}"
 addThisIP="${2}"
 siteName="${3}"
 serverGroupName="${4}"
 echo -e "\n- Trying to create a new OS connection IP now.\n";

 ##Make sure while initiating a REST API call, any parameter which has ' ' (space) in Imperva should be substituted with '%20'.
 ##JSESSIONID will be generated first and will be available to this function
 create_new_ip_output="$(curl -ik -X POST -H "Cookie: JSESSIONID=$JSESSIONID" -H "Content-Type: application/json" -H "Accept: application/json" "https://${MX}:8083/SecureSphere/api/v1/conf/serverGroups/${siteName// /%20}/${serverGroupName// /%20}/servers/${addThisIP}" -d '{"connection-mode":"SSH","host-name":"thisLinuxServer.fdqn","OS-type":"linux","user-name":"enter_your_userID"}')";
 return_code="$?";
 if [[ "${return_code}" == "0" && ! `echo "${create_new_ip_output}" | grep "do not have permission"` ]]; then
  echo -e "\n\n- OS connection IP (${addThisIP}) created successfully in site: ${siteName}, servergroup: ${serverGroupName} and stdout:\n${create_new_ip_output}\n";
  return 0;
 else
  echo -e "\n\n- Failed to create a new OS connection IP (${addThisIP}) in site: ${siteName} and servergroup: ${serverGroupName}\n- using session ID: ${JSESSIONID}, error log:\n${create_new_ip_output}\n";
  return 1;
 fi
}

好的,上面的代码工作正常,一旦运行,我就会看到有效的输出,显示IP是否成功添加,或者失败消息是什么。

现在,我正在尝试在NodeJS中实现相同的功能。

为此,我成功地创建了一些函数来生成JSESSIONID (这样我就可以使用它来执行多个REST/API调用操作,而不是每次为任何操作创建一个新会话),成功地删除JSESSIONID (即从Imperva会话中注销/退出,这样我就不会达到限制),并且如果之前已经添加了一个IP,就可以在Imperva系统中成功地搜索它。

使用上面的shell脚本逻辑,我编写了下面的NodeJS代码,使用Rest/API在Imperva中添加一个新的OS连接IP,但是我得到了一个错误。

代码语言:javascript
复制
//Imperva create IP
//qData is a hash array that has valid index/value pair values.
var impervaCreateIP = function(qData){
  var deferred = Q.defer();
  var data = ''
  var options = {
    hostname: 'myImpervaServerInstance.mycompanydomain.com',
    port: 8083,
    method: 'POST',
    path: '/SecureSphere/api/v1/conf/serverGroups/'+ qData['siteName'] + '/' + qData['serverGroupName'] + '/servers/' + qData['ip'],
    headers: {
      'Content-Type': 'application/xml',
      'X-Requested-With': 'Nodejs',
      'Cookie': 'JSESSIONID='+qData['sid']
    }
  }
  //svtLog() is a logger that I'm using to log messages to a file. Out of scope of this post.
  svtLog('info','Imperva','Inside impervaCreateIP function')
  svtLog('info','Imperva',qData['ip'])
  svtLog('info','Imperva',qData['siteName'])
  svtLog('info','Imperva',qData['serverGroupName'])
  svtLog('info','Imperva','')
  console.log('Inside impervaCreateIP')
  console.log(options);
  httpHelp(options, data)
  .then(function(fullResponse){
    var result = JSON.parse(fullResponse[1])
    console.log("11 -----")
    console.log(result)
    console.log("22 -----")
    deferred.resolve(qData['sid'])
    console.log(result)
  })
  .fail(function(e){
    svtLog('error','Imperva','Failed to add IP in Imperva')
    svtLog('info','Imperva',qData['ip'])
    svtLog('error','Imperva',e)
    svtLog('info','Imperva','')
    deferred.reject(e)
  })
  return deferred.promise;
}

错误消息:

代码语言:javascript
复制
Inside impervaCreateIP
{ hostname: 'myImpervaServerInstance.mycompanydomain.com',
  port: 8083,
  method: 'POST',
  path: '/SecureSphere/api/v1/conf/serverGroups/some%20Site%20NameInImperva/someServerGroupNameInImperva_01/servers/10.20.30.40',
  headers: 
   { 'Content-Type': 'application/xml',
     'X-Requested-With': 'Nodejs',
     Cookie: 'JSESSIONID=7B3C378D365B673F6C749847DEDC7D8F } }
[SyntaxError: Unexpected token <]

我在找两样东西:

  1. 如何解决错误(如上面所示)。
  2. 如何在上面的代码中传递CURL的-d选项{.} body参数,就像我在shell脚本中使用的那样。

PS:将POST更改为GET (方法),确保代码在语法上很好,因为它成功地用上面的NodeJS代码显示了IP (使用GET操作)。

所以,只有当我使用POST(即当我试图创建IP时) -vs- GET (我用它来查找IP存在与否)时,才会失败。我按照Imperva API文档进行了检查,响应以JSON格式出现。不确定是否由于缺少bullet# 2问题,我得到这个语法错误与POST。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-21 03:08:36

好的。

bullet# 1和#2的解决方案都是在NodeJS中设置CURL "-d选项值“,如下所示(我在前面将其设置为空白):

代码语言:javascript
复制
  var data = '{"connection-mode":"SSH","host-name":"thisLinuxServer.fdqn","OS-type":"linux","user-name":"enter_your_userID"}'

现在,选项和数据都将被发送到httpHelp( options,data),并且它将工作。

以上只是一个虚拟的数据值。通常,我会在JSON对象中传递有效的主机名。

从未想过不设置数据变量会导致这个语法错误。

另一件事,我错过了大量的时间是‘内容-类型’内标头变量的值。这就是原因,错误消息中有"<“括号(默认情况下,它查找一个包含某些<body>...</body> 格式的节,但在我们的示例中,正文部分包含或正在以JSON { . }格式方式返回响应)。这就是为什么它显示了一个用于意外令牌<的错误。

根据API文档,它应该是"JSON“类型,因此将该行更改为

代码语言:javascript
复制
'Content-Type': 'application/json',
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37933251

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档