如何使用Groovy代码删除响应体中Gerrit的REST API的魔术前缀?

时间:2017-01-12 16:51:26

标签: json rest groovy gerrit

我的代码:

@Grab('org.codehaus.groovy.modules.http-builder:http-builder:0.7')
@Grab('oauth.signpost:signpost-core:1.2.1.2')
@Grab('oauth.signpost:signpost-commonshttp4:1.2.1.2')
import groovyx.net.http.RESTClient
import static groovyx.net.http.ContentType.*

def gerrit = new RESTClient('http://localhost:8080/gerrit')
gerrit.auth.basic "gerrit", "password123"
gerrit.get( path: 'changes/1234/reviewers' ) 

根据https://gerrit-review.googlesource.com/Documentation/rest-api.html#authentication

“为了防止跨站点脚本包含(XSSI)攻击, JSON响应正文以一个魔术前缀行开始,必须在将其余响应主体提供给JSON解析之前将其去除 r :“

  )]}'
  [ ... valid JSON ... ]

我的错误:

WARNING: Error parsing 'application/json; charset=UTF-8' response
groovy.json.JsonException: Unable to determine the current character, it is not a string, number, array, or object

The current character read is ')' with an int value of 41
Unable to determine the current character, it is not a string, number, array, or object
line number 1
index number 0
)]}'

2 个答案:

答案 0 :(得分:1)

抱歉,我对Groovy不是很熟悉,但是除非你想修改源代码并推出你自己的版本,否则无法从Gerrit中删除这个前缀。

解决方案是使用不同的Groovy API来获取原始数据,去掉前5个字符,然后将其提供给Groovy JSON解析器。再说一遍,很抱歉,但我无法帮助解决Groovy API的问题。

正如文档所提到的,这些角色有时很烦人,但Gerrit的一个重要安全特性是防止任何XSS攻击。

答案 1 :(得分:0)

我找到了答案。

# controllers/contenders_controller.rb
def index
  @post = Post.find_by(id: params[:post_id] )
  @contenders = @post.contenders
end