gpt4 book ai didi

swift - HTTP 请求 swift 提供参数

转载 作者:搜寻专家 更新时间:2023-10-31 22:08:52 25 4
gpt4 key购买 nike

对于我的大学的一个简单的 iOS (swift) 应用程序,我尝试登录到他们的页面之一以检索我卡上当前的金额。但是,在执行我的 http 请求时,我无法获得所需的数据。

这是我的代码:

let url = NSURL(string: "https://campuscard.hhs.nl/portal/j_spring_security_check")
let request = NSMutableURLRequest(URL: url)

request.HTTPMethod = "POST"
request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")

let data : NSData = ("?j_username=USERNAME&j_password=PASSWORD").dataUsingEncoding(NSUTF8StringEncoding)!;
request.HTTPBody = data;

NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) {(response, data, error) in
println(NSString(data: data, encoding: NSUTF8StringEncoding))
}

它提示我输入了错误的凭据,当我打印我的请求时它说:

<NSMutableURLRequest: 0x7f8d7b53bd30> { URL: https://campuscard.hhs.nl/portal/j_spring_security_check, headers: {
"Content-Type" = "application/x-www-form-urlencoded";
} }

所以我认为它不包括用户名和密码。

有没有人有想法?

我和我大学的其他学生会非常感激!

已添加

我和我类的一个 friend ,感谢您,我们通过 Charles 看到了请求中的属性,但是由于我们都从未尝试过使用它,所以我们不知道如何处理这些属性。我们只是将我们能找到的所有内容添加到请求中并进行了尝试,但我们仍然在服务器上收到 ArrayOutOfBoundsException。

var dataString = "j_username=USERNAME&j_password=PASSWORD"
var request : NSMutableURLRequest = NSMutableURLRequest()
request.URL = NSURL(string: "https://campuscard.hhs.nl/portal/j_spring_security_check")
var postString = (dataString as NSString).dataUsingEncoding(NSUTF8StringEncoding)

request.HTTPMethod = "POST"

request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
//request.setValue("JSESSIONID=C78C688403A836968EC1FEAED9AE9126", forHTTPHeaderField: "Cookie")
request.setValue("campuscard.hhs.nl", forHTTPHeaderField: "Host");
request.setValue("keep-alive", forHTTPHeaderField: "Connection");
request.setValue("41", forHTTPHeaderField: "Content-Length");
request.setValue("max-age=0", forHTTPHeaderField: "Cache-Controle");
request.setValue("text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", forHTTPHeaderField: "Accept");
request.setValue("https://campuscard.hhs.nl", forHTTPHeaderField: "Origin");
request.setValue("https://campuscard.hhs.nl/portal/login", forHTTPHeaderField: "Referer");
request.setValue("gzip,deflate", forHTTPHeaderField: "Accept-Encoding");
request.setValue("nl-NL,nl;q=0.8,en-US;q=0.6,en;q=0.4", forHTTPHeaderField: "Accept-Language");
request.HTTPBody = postString

NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) {(response, data, error) in
println(NSString(data: data, encoding: NSUTF8StringEncoding))
}

我很抱歉把这么大的一段代码放在你身上,但也许有些地方你能看到是错误的。谢谢你的时间

最佳答案

x-www-form-urlencoded 请求的主体不应包含 ?


顺便说一句,您应该对 USERNAMEPASSWORD 进行百分比编码。现在,如果其中任何一个(更有可能是密码)包含某些保留字符,您的请求就会失败。我在 Swift 2 中使用这样的扩展:

extension String {

/// Percent escape value to be added to a HTTP request
///
/// This percent-escapes all characters besize the alphanumeric character set and "-", ".", "_", and "*".
/// This will also replace spaces with the "+" character as outlined in the application/x-www-form-urlencoded spec:
///
/// http://www.w3.org/TR/html5/forms.html#application/x-www-form-urlencoded-encoding-algorithm
///
/// - returns: Return percent escaped string.

func stringByAddingPercentEncodingForFormUrlencoded() -> String? {
let allowedCharacters = NSCharacterSet(charactersInString: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._* ")

return stringByAddingPercentEncodingWithAllowedCharacters(allowedCharacters)?.stringByReplacingOccurrencesOfString(" ", withString: "+")
}
}

我在 USERNAMEPASSWORD 值(但不是整个字符串)上使用此 stringByAddingPercentEncodingForFormUrlencoded 函数。

或者,在 Swift 3 中:

extension String {

/// Percent escape value to be added to a HTTP request
///
/// This percent-escapes all characters besize the alphanumeric character set and "-", ".", "_", and "*".
/// This will also replace spaces with the "+" character as outlined in the application/x-www-form-urlencoded spec:
///
/// http://www.w3.org/TR/html5/forms.html#application/x-www-form-urlencoded-encoding-algorithm
///
/// - returns: Return percent escaped string.

func addingPercentEncodingForFormUrlencoded() -> String? {
let allowedCharacters = CharacterSet(charactersIn: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._* ")

return addingPercentEncoding(withAllowedCharacters: allowedCharacters)?.replacingOccurrences(of: " ", with: "+")
}
}

在检查 NSURLRequest 时缺少用户名和密码一点也不担心(我不希望它在您这样记录时包含请求的主体)。如果你想检查,通过 Charles 或类似的东西运行它。

如果您使用的是 Charles,如果您想检查 HTTPS 交互,则必须启用 SSL 代理,并将您的域添加到位置列表。请参阅“代理”菜单上的“代理设置...”,然后单击“SSL”选项卡。见 Charles Web Debugging Proxy

这将向您展示完整的请求。如果您尝试让您的应用程序像从网络浏览器一样登录,您可以使用 Charles 来观察网络浏览器交换并将其与您的应用程序进行比较和对比。


在您修改后的问题中,您现在显示了您尝试设置的所有各种标题。 (您不必设置其中一些:在 Charles 中观察现有应用程序请求,您会看到其中一些已经设置。)如果需要其中任何一个,我会感到惊讶。

具有讽刺意味的是,唯一可能很关键的是您注释掉的 JSESSIONID。哈哈。其中许多网站会在登录 HTML 中提供一些 session ID。然后,当您尝试提交登录请求时,您必须传递登录 HTML 页面提供给您的相同 JSESSIONID

所以模型通常是(a)获取登录页面; (b) 将其解析为需要在后续请求中设置的任何 header 字段(例如,根据您的示例,它看起来可能是 JSESSIONID); (c) 为所有后续请求提供该 session ID。

这是假设,因为我无法真正看到完整的对话 b/w 网络浏览器和您的特定网络服务器,但这是我以前见过的那种模式。只需观察 Web 浏览器请求/响应,特别注意隐藏在 HTML 中的神秘 ID 号,这些 ID 号可能会在后续请求中(在正文或 header 中)提供。

关于swift - HTTP 请求 swift 提供参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26317514/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com