【问题标题】:NSURLRequest produce different result than HTTP proxy clientNSURLRequest 产生与 HTTP 代理客户端不同的结果
【发布时间】:2015-10-13 18:08:34
【问题描述】:

我从 HTTP 代理客户端和NSURLRequest + NSURLConnection 发送相同的 HTTP 消息,并得到不同的结果。这是一个身份验证请求。接受来自 HTTP 代理的身份验证请求,不接受来自应用程序的发送。为什么?接受意味着重定向后的 HTML 将不包含 Oops 子字符串。

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 下面的代码放入操场和一个空的单视图应用程序项目中。项目中返回的 HTML 包含 Oops 子字符串,操场中使用的代码不包含它,知道发生了什么,为什么相同的请求会产生不同的 HTML 结果?我也收到了来自 iOS 设备和模拟器的 failed 消息。

更新

已删除 NSURLRequest 缓存,如推荐的 here,但仍无法按预期工作。还有here

更新

尝试删除所有凭据,例如 here,但没有帮助,没有找到凭据。

【问题讨论】:

  • 如果我是你,我可能会从屏幕截图中删除你的电子邮件/密码
  • 有人可能会测试身份验证请求,这是故意的
  • 感谢您的帮助,问题有所不同,调用了两个不同的 url :-(

标签: ios caching nsurlconnection nsurlrequest


【解决方案1】:

看起来当你收到 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 将返回身份验证失败消息,代理成功消息
  • 我冒昧地使用您的凭据并从我的游乐场发布数据,唯一的区别是 Web 登录重定向到 /challenge 和 ios 登录重定向到 /user 其余的似乎没问题,请参阅我在上面帖子中的代码。
  • 使用了你的代码,发现了一个很奇怪的效果,在操场上它返回success,但在应用程序中它返回failed,知道为什么吗?
  • @János,这很奇怪,但是您可以将运行 url 请求的 queuecurrent 更改为 mainNSOperationQueue.mainQueue() 并将 dispatch_main() 添加到您的主要功能中,您发现有什么不同吗?这不是一个真正的答案,只是为了理解找到解决方案的问题。
猜你喜欢
  • 1970-01-01
  • 2018-07-30
  • 2017-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 2019-08-17
  • 2015-04-24
相关资源
最近更新 更多