我一直在设计一个客户端,以显示锁定在登录屏幕后面的网站上的数据。 我一直在嗅探登录POST请求时传递的标头和参数,并且能够生成代码,从而在Jsoup中成功复制此登录名,并传递适当的标头和参数。 但是,在Alamofire中传递完全相同的标头和参数,会使网站响应并显示一条错误消息,指出该服务对于不允许“按会话cookie”的客户端无法使用。此外,响应中不包含用于访问网站其他区域的密钥。
功能性Jsoup代码
let headers: HTTPHeaders = ["Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Connection": "keep-alive",
"Host": "www.lectio.dk",
"Referer": "https://www.lectio.dk/lectio/\(schoolNo)/login.aspx",
"Cookie" : "ASP.NET_SessionId=" + sessionID + ";"]
let parameters: Parameters = ["__EVENTARGUMENT": "",
"__EVENTTARGET":"m$Content$submitbtn2",
"__EVENTVALIDATION" : eventValidation,
"__SCROLLPOSITION":"",
"__VIEWSTATE":"",
"__VIEWSTATEX":viewStateX,
"__VIEWSTATEY_KEY" : "",
"LectioPostBackId":"",
"m$Content$passwordHidden":password,
"m$Content$username2":username,
"time":"0"]
Alamofire.request("URL OF LOGIN PAGE", method: .post, parameters:parameters, headers: headers).responseString { response in ...
Alamofire代码不太实用
strm,status = container.get_archive("container_path/")
for d in strm:
pw_tar = tarfile.TarFile(fileobj=StringIO(d.decode('utf-8')))
pw_tar.extractall("extract_to/")
网站如何处理身份验证
在传递GET请求时,一些重要的值被传回。即稍后使用的SessionId。将其存储以供以后在POST请求中使用。
单击登录按钮时,上述值将作为标题或参数(包括用户名和密码)传递。验证成功后,将返回一个特殊密钥,并将用户引到主页上。
现在,使用Jsoup,身份验证可以正常工作,并且解析的响应是用户登录的正确主页。
在Alamofire中,身份验证不成功,导致出现上述错误消息。
由于标头和参数相同,所以我想问题在于Alamofire和jsoup处理请求的方式。帖子的内容类型为application / x-www-form-urlencoded。我相信Alamofire会默认使用其他默认设置,但是文档中并未说明要更改每个alamofire版本4的默认设置。(根据迁移指南,它在版本3中具有此编码功能)
我不确定从这里去哪里。任何帮助非常感谢 -山姆
答案 0 :(得分:0)
听起来Cookie的处理方式不同。初始GET请求的响应似乎包含一个cookie,服务器希望该cookie在以下POST请求中。看起来Jsoup会在后续请求中自动发送接收到的Cookie,但Alamofire不会。这可以解释服务器抱怨缺少“每个会话cookie”的支持。对于Alamofire方法,请尝试从响应中读取对初始GET请求的cookie,并为后续请求明确设置它们。
答案 1 :(得分:0)
如果参数编码有问题:您可以在
的Alamofire请求中将其更改为application/x-www-form-urlencoded
Alamofire.request("{URL}", method: .post, parameters: parameters, encoding: URLEncoding.httpBody, headers: headers)
(请参阅https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#parameter-encoding)
现在,我看到了您的代码,并经过进一步调查,我认为Alamofire实际上确实会自动处理cookie的发送(请参阅Does Alamofire store the cookies automatically?),而Jsoup不会,因此您明确设置的cookie头也是如此,被某些Alamofire内部Cookie处理所覆盖。尝试通过添加来禁用Cookie标头的自动设置
Alamofire.SessionManager.default.session.configuration.httpShouldSetCookies = false
在执行请求之前。
答案 2 :(得分:0)
我最近有类似的问题。我发送POST请求,并在服务器中收到GET。 我发现这是由网址格式错误引起的。
我正在“ https://webpage.com/post”上发送POST请求。我忽略了我得到301的响应,然后将我重定向到“ https://www.webpage.com/post”。 重定向更改了请求的类型。
我只将url格式更改为“ https://www.webpage.com/post”,然后它开始工作。