gpt4 book ai didi

swift - 使用 swift 发布二进制数据

转载 作者:行者123 更新时间:2023-11-28 14:20:58 24 4
gpt4 key购买 nike

我想通过 RxAlamofire、Alamofire 甚至没有任何库发布二进制数据,但经过几天的研究和尝试,我无法做到。

在这里您可以找到我要重现的请求的 POSTMAN 示例:

captura de pantalla 2018-08-20 a las 13 42 36 captura de pantalla 2018-08-20 a las 13 42 48

是一个带有 Authorization 和 Content-Type header 以及附加的二进制数据的 post 方法。

我试图找到一些示例或相关内容,但找不到解决方案。我只能找到多部分表单数据示例,但是对于多部分表单数据,服务器不起作用(是外部 API)

如果有人可以指导我或向我展示一些示例代码。

这里以用于登录的代码为例,并向您展示我想要实现的目标:

public class APIClient: DataSource {

public static var shared: APIClient = APIClient()

private init(){}

public func login(email:String, password:String) -> Observable<LoginResponse> {
return RxAlamofire.requestJSON(APIRouter.login(email:email, password:password))
.subscribeOn(MainScheduler.asyncInstance)
.debug()
.mapObject(type: LoginResponse.self)
}

}

这里是 LoginResponse 对象:

public struct LoginResponse: Mappable {
var tokenId: String?
var userId: String?

public init?(map: Map) {}

public mutating func mapping(map: Map) {
tokenId <- map["id"]
userId <- map["userId"]
}

}

最后是扩展 URLRequestConvertible 的 APIRouter:

enum APIRouter: URLRequestConvertible {

case login(email: String, password: String)

private var method: HTTPMethod {
switch self {
case .login:
return .post
}
}

private var path: String {
switch self {
case .login:
return "users/login"
}
}

private var parameters: Parameters? {
switch self {
case .login(let email, let password):
return [APIConstants.LoginParameterKey.email: email, APIConstants.LoginParameterKey.password: password]
}
}

private var query: [URLQueryItem]? {
var queryItems = [URLQueryItem]()
switch self {
case .login:
return nil
}
}

func asURLRequest() throws -> URLRequest {
var urlComponents = URLComponents(string: APIConstants.ProductionServer.baseURL)!
if let query = query {
urlComponents.queryItems = query
}

var urlRequest = URLRequest(url: urlComponents.url!.appendingPathComponent(path))

// HTTP Method
urlRequest.httpMethod = method.rawValue

urlRequest.addValue(ContentType.json.rawValue, forHTTPHeaderField: HTTPHeaderField.acceptType.rawValue)
urlRequest.addValue(ContentType.json.rawValue, forHTTPHeaderField: HTTPHeaderField.contentType.rawValue)

if let parameters = parameters {
do {
urlRequest.httpBody = try JSONSerialization.data(withJSONObject: parameters, options: [])
} catch {
throw AFError.parameterEncodingFailed(reason: .jsonEncodingFailed(error: error))
}
}


return urlRequest
}
}

提前致谢!

编辑转换成 RxAlamofire

使用下面的代码我可以解决问题并将其转换为 RxSwift 但我想使用 RxAlamofire 获得相同的结果:

public func upload(media: Data) -> Observable<ContentUri> {
let headers = [
"content-type": "image/png",
"authorization": "token header"
]
return Observable<ContentUri>.create({observer in
Alamofire.upload(media, to: "\(endPoint)/api/media/upload", headers: headers)
.validate()
.responseJSON { response in
print(response)
}
return Disposables.create();
})
}

最佳答案

Alamofire.upload()(返回一个 UploadRequest)可能会做你想做的事:

let headers = [
"Content-Type":"image/jpeg",
"Authorization":"sometoken",
]

let yourData = ... // Data of your image you want to upload
let endPoint = ...

Alamofire.upload(yourData, to: "\(endPoint)/api/media/upload", headers: headers)
.validate(statusCode: 200..<300)
.responseJSON { response in
// handle response
}

此示例不包括 RxAlamofire - 但我很确定它具有类似的 upload 功能。希望对您有所帮助!

关于swift - 使用 swift 发布二进制数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51942679/

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