我在尝试使用cfhttp
时遇到问题。我使用的API要求我发送登录凭据,然后发送后续命令。对后续命令的答复是“需要登录”。在查看了我的请求之后,我认为我已经找到了问题,但我不理解。
这是我的登录电话:
<cfhttp url="#Target#" result="LoginAttempt" method="POST" REDIRECT="No" useragent="#strUserAgent#">
<cfhttpparam type="FORMFIELD" name="action" value="Login" />
<cfhttpparam name="loginUsername" value="#Username#" type="FORMFIELD" />
<cfhttpparam name="loginPassword" value="#Password#" type="FORMFIELD" />
</cfhttp>
当它返回200 OK
时,我将cookie设置为用于以后的呼叫:
<cfset ThisCookie = LoginAttempt.responseHeader["Set-Cookie"] />
然后,继续下一个调用:
<cfhttp url="#Target#" result="CreateTransactionAttempt" method="POST" REDIRECT="No" useragent="#strUserAgent#">
<cfhttpparam type="header" name="Cookie" value="#ThisCookie#" />
<cfhttpparam type="FORMFIELD" name="action" value="CreateTransaction" />
<cfhttpparam type="FORMFIELD" name="transactionName" value="#TransactionName#" />
</cfhttp>
我认为的问题是这个;当我查看第二个cfhttp
调用的标题时,它与第一个调用提供的cookie不匹配。我不确定为什么会这样。在Ben Nadel的博客页面here上,他具有将返回的cookie拆分为一个结构并将其传递给第二个调用的函数。我已经尝试了相同的结果。我想念什么吗?
答案 0 :(得分:10)
您不能从响应中获取Set-Cookie
标头,而只能在请求中将其作为Cookie
标头回显。 Set-Cookie可以包含Domain
,Path
,Secure
,HttpOnly
,Expires
,Max-Age
等伪指令。您需要删除并将它们减少为Cookie的键/值对,因为这就是您请求中的Cookie标头。
响应:
Set-Header: JSESSIONID=9335968036E8B5EE9F9D00032A5A665D; Path=/; HttpOnly
键值对:
Key: JSESSIONID
Val: 9335968036E8B5EE9F9D00032A5A665D
请求:
Cookie: JSESSIONID=9335968036E8B5EE9F9D00032A5A665D
响应:
Set-Header: JSESSIONID=9335968036E8B5EE9F9D00032A5A665D; Path=/; HttpOnly
Set-Header: uid=d1b68f6fe0ca70e8d53bd3a2f32d06c1f1554317436; expires=Thu, 02-Apr-20 18:50:36 GMT; path=/; domain=.example.org; HttpOnly
键值对:
Key: JSESSIONID
Val: 9335968036E8B5EE9F9D00032A5A665D
Key: uid
Val: d1b68f6fe0ca70e8d53bd3a2f32d06c1f1554317436
请求:
Cookie: JSESSIONID=9335968036E8B5EE9F9D00032A5A665D; uid=d1b68f6fe0ca70e8d53bd3a2f32d06c1f1554317436
对于初学者来说,有些天真,例如:
<cfset ThisCookie = getToken(LoginAttempt.responseHeader["Set-Cookie"], 1, ";") />
可能已经为您解决了这个问题。
答案 1 :(得分:0)
在研究同样的问题时,我遇到了 CFHTTPSession.cfc by Ben Nadel 为您处理 cookie。