【问题标题】:HTTPBuilder & Session IDHTTPBuilder 和会话 ID
【发布时间】:2017-09-30 01:50:02
【问题描述】:

我有以下代码来连接到 REST API 服务、进行身份验证、检索会话 ID,然后通过会话 ID 发出进一步的请求以进行身份​​验证。初始请求有效,我在响应中得到 HTTP 200 OK 加上会话 ID,但是当我尝试发出第二个请求时,在标头中传递会话 ID,我得到 ​​p>

捕获:groovyx.net.http.HttpResponseException: Bad Request

我知道使用类和 try/catch 等可以更好地编写脚本。我仍在学习 java 和 groovy,所以我首先尝试在同一个类中做所有事情。

非常感谢任何帮助。

import groovyx.net.http.HTTPBuilder
import groovyx.net.http.URIBuilder
import static groovyx.net.http.Method.POST
import static groovyx.net.http.ContentType.*

def url = 'https://1.1.1.1/web_api/'
def uri = new URIBuilder(url)

String CHKPsid

uri.path = 'login'
def http = new HTTPBuilder(uri)
http.ignoreSSLIssues()


http.request(POST,JSON ) { req ->
headers.'Content-Type' = 'application/json'
body = [
        "user":"username",
        "password":"password"
]
    response.success = { resp, json ->
        println (json)
        CHKPsid = (json.sid)
        println "POST Success: ${resp.statusLine}"
    }
}

uri.path = 'show-changes'
http.request(POST,JSON ) { req ->
headers.'Content-Type' = 'application/json'
headers.'X-chkp-sid' = '${CHKPsid}'
body = [
        "from-date"   : "2017-02-01T08:20:50",
        "to-date"     : "2017-10-21"
  ]
    response.success = { resp, json ->
        println (json)
        println "POST Success: ${resp.statusLine}"
  }
}

【问题讨论】:

  • 400 Bad Request 表示您的请求不正确。尝试先读取服务器响应,看看你正在执行的请求有什么问题(REST API 应该返回一个描述错误的 JSON 对象)。
  • 感谢@SzymonStepniak。失败响应如下[code:generic_err_invalid_syntax, message:Login request message processing failed] POST Failure: HTTP/1.1 400 Bad Request。我怀疑错误的代码是我尝试将会话 ID 分配变量(CHKPsid)的值作为 X-chkp-sid 传递到请求标头中。这看起来正确吗?

标签: groovy httpbuilder


【解决方案1】:

String interpolation 不适用于单引号(或三个单引号)。当 groovy 将评估 '${CHKPsid}'(单引号)时,其值为 ${CHKPsid}(此字符串)。为了使用变量的,您应该使用双引号:"${CHKPsid}" 或仅使用变量:headers.'X-chkp-sid' = CHKPsid

所以这个输出:

String CHKPsid = "abc123"
println '${CHKPsid}'
println "${CHKPsid}"

将是:

${CHKPsid}
abc123

为了快速测试服务器接收到什么,可以使用httpbin.orgrequestb.in

【讨论】:

  • 谢谢。 'headers.x-chkp-sid' = CHKPsid 工作并正确传递 sid。
【解决方案2】:

除了正确分配会话 ID 的值外,我发现即使更改了 uri、标头和正文,第二次调用相同的 HTTPbuilder - http.request 也是问题所在。侦听服务器仍将其视为同一登录 API 调用的一部分。我的解决方法/解决方案是使用不同的名称定义第二个 HTTPbuilder,现在可以使用。我很想知道这是否是正常行为以及其他人如何处理这个问题。谢谢。

【讨论】:

    猜你喜欢
    • 2012-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多