NSURLRequest与HTTP代理客户端产生不同的结果

10

我使用HTTP代理客户端和NSURLRequest+NSURLConnection发送了同样的HTTP消息,但得到了不同的结果。这是一个身份验证请求。从HTTP代理身份验证请求被接受,而从应用程序发送的则没有。为什么?"被接受"意味着重定向后的HTML中不包含Oops子字符串。

enter image description here

let url = NSURL(string: "http://www.swisshttp.weact.ch/en/user/login")
let request = NSMutableURLRequest(URL: url)
request.HTTPMethod = "POST"
request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")

let email2 = (viewController!.email.text as NSString).stringByReplacingOccurrencesOfString("@", withString: "%40")
let str = "name=\(email2)&pass=\(viewController!.password.text)&form_id=user_login" as NSString
let d = str.dataUsingEncoding(NSUTF8StringEncoding)
if let d2 = d {
    request.HTTPBody = d2
    let urlConnection = NSURLConnection(request: request, delegate: self)
}

更新

我已经将 @teamnorge 的代码放进 Playground 和空的单视图应用程序项目中。在项目中返回的 HTML 包含了 Oops 子字符串,而在 Playground 中使用的代码则不包含它。有什么想法是怎么回事,为什么同样的请求会产生不同的 HTML 结果?我从 iOS 设备和模拟器中都收到了 failed 消息。

更新

移除了像这里推荐的 NSURLRequest 缓存,但仍未按预期工作。还有这里

更新

尝试移除所有的凭据,如这里所述,但没有帮助,没有发现任何凭证。


2
如果我是你,我可能会从截图中删除你的电子邮件/密码。 - liamnichols
有人可能测试认证请求,这是故意的。 - János
谢谢您的帮助,问题是不同的,调用了两个不同的URL :-( - János
1个回答

2

看起来当你收到HTTP 302和新的Location URL时,iOS会自动通过此URL获取页面,因此我猜想你的响应实际上是重定向页面的HTML内容。请验证一下。

更新:

import UIKit
import XCPlayground

let url = NSURL(string: "http://www.swisshttp.weact.ch/en/user/login")
let request = NSMutableURLRequest(URL: url!)
let str = "name=kukodajanos%40icloud.com&pass=jelszo&form_id=user_login" as  NSString
let d = str.dataUsingEncoding(NSUTF8StringEncoding)
request.HTTPBody = d
request.HTTPMethod = "POST"
request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")

NSURLConnection.sendAsynchronousRequest(request, queue:     NSOperationQueue.currentQueue()) { response, maybeData, error in
   if let data = maybeData {
       let contents = NSString(data:data, encoding:NSUTF8StringEncoding)
       println(contents)

            if contents!.rangeOfString("Oops").length == 0 {

                println("success")
            } else {
                println("failed")
            }
   } else {
       println(error.localizedDescription)
   }
}

XCPSetExecutionShouldContinueIndefinitely()

部分你是对的,iOS会自动重定向请求,但是结果页面与我在代理客户端中得到的不同,iOS会返回认证失败消息,代理则返回成功消息。 - János
我冒昧使用了你的凭据并从我的游乐场发布了一些数据,唯一的区别是Web登录重定向到/challenge而iOS登录重定向到/user,其他看起来都没问题,详见上面的帖子中的代码。 - teamnorge
使用了你的代码,发现一个非常奇怪的效果,在 playground 中返回 success,但在应用程序中返回 failed,有什么想法吗? - János
@János,这听起来很奇怪,但你可以将要运行URL请求的“队列”从“current”更改为“main”。使用NSOperationQueue.mainQueue()并向主函数添加dispatch_main(),您看到了什么不同吗?这不是真正的答案,只是为了理解问题所在以找到解决方案。 - teamnorge

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接