HTTP POST请求在Alamofire中的响应与在Jsoup中的响应不同

时间:2018-06-20 12:41:36

标签: ios swift jsoup alamofire

我一直在设计一个客户端,以显示锁定在登录屏幕后面的网站上的数据。 我一直在嗅探登录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中具有此编码功能)

我不确定从这里去哪里。任何帮助非常感谢 -山姆

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”,然后它开始工作。