翻译一个python脚本到swift(http post请求)

gcuhipw9  于 2022-12-22  发布在  Swift
关注(0)|答案(1)|浏览(115)

我有一个工作的python脚本,从一个网站获得cookie。我想把它转换成swift脚本,但我做错了什么,不能理解在哪里。不幸的是,我才开始学习swift。

#!/usr/bin/env python
import warnings
import json
import os
import requests

auth_login='someName'
auth_password='somePassword'
passport_params = {'from': 'passport', 'retpath': 'https://192.168.0.1/passport?mode=passport', 'passwd': auth_password, 'login': auth_login, 'display': 'page'}
passport_session = requests.session()
passport_error_passwd = u"wrong pass"
passport_error_login = u"no such users"
print('Connecting to passport...')
try:
    passport_request = passport_session.post('https://192.168.0.1/passport?mode=auth', data=passport_params, verify=False)
except:
    print('Error connecting')
if os.name == 'nt':
    os.system("pause")
    exit(1)
else:
    print('Authentication successful')
    passport_cookies = requests.utils.dict_from_cookiejar(passport_session.cookies)
    print('cookies=')
    print(passport_cookies)

我在swift中的尝试。我不确定我的帖子请求是否正确工作,这就是为什么我的cookie为空。

let auth_login = "someName"
let auth_password = "somePassword"
let url = URL(string: "https://192.168.0.1/passport?mode=auth")!
var request = URLRequest(url: url)
request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
request.setValue("application/json", forHTTPHeaderField: "Accept")
request.httpMethod = "POST"

let parameters = [
    "from": "passport",
    "retpath": "https://192.168.0.1/passport?mode=passport",
    "passwd": auth_password,
    "login": auth_login,
    "display": "page"
]

request.httpBody = try? JSONSerialization.data(withJSONObject: parameters)
let task = URLSession.shared.dataTask(with: request) { data, response, error in
    guard
//        let data = data,
        let response = response as? HTTPURLResponse,
        let fields = response.allHeaderFields as? [String: String]
    else {
        print("error", error ?? URLError(.badServerResponse))
        return
    }

    let cookies = HTTPCookie.cookies(withResponseHeaderFields: fields, for: url)
    print("cookies:\n\(cookies)")

    
    guard (200 ... 299) ~= response.statusCode else {                  
        print("statusCode should be 2xx, but is \(response.statusCode)")
        print("response = \(response)")
        return
    }
        
}

task.resume()
3wabscal

3wabscal1#

你的python代码正在发送这些:

passport_params = {'from': 'passport', 'retpath': 'https://192.168.0.1/passport?mode=passport', 'passwd': auth_password, 'login': auth_login, 'display': 'page'}

作为POST数据有效载荷。
而你的Swift代码

let parameters = [
    "from": "passport",
    "retpath": "https://192.168.0.1/passport?mode=passport",
    "passwd": auth_password,
    "login": auth_login,
    "display": "page"
]

request.httpBody = try? JSONSerialization.data(withJSONObject: parameters)

是作为JSON http主体来做的。
因此,这些请求非常不同,因此您遇到了问题。
看看这个answer如何在Swift中配置请求中的POST数据。

相关问题