Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 使用Combine将对象编码到URLRequest中的httpBody_Swift_Combine - Fatal编程技术网

Swift 使用Combine将对象编码到URLRequest中的httpBody

Swift 使用Combine将对象编码到URLRequest中的httpBody,swift,combine,Swift,Combine,是否有一种方法可以使用Combine将对象编码为urlRequest.httpBody,或者将解码错误返回为带有特定错误类型的AnyPublisher 我无法实现这一点,而且似乎没有使用combine对对象进行编码的代码示例。必须强制将编码错误转换为AnyPublisher似乎不正确/不安全 谢谢 func create(object: ExampleObject, token: Token) -> AnyPublisher<ExampleObject, API.Error>

是否有一种方法可以使用Combine将对象编码为
urlRequest.httpBody
,或者将解码错误返回为带有特定错误类型的AnyPublisher

我无法实现这一点,而且似乎没有使用combine对对象进行编码的代码示例。必须强制将编码错误转换为AnyPublisher似乎不正确/不安全

谢谢

func create(object: ExampleObject, token: Token) -> AnyPublisher<ExampleObject, API.Error> {

    let url = API.EndPoint.players.url
    var urlRequest = URLRequest(url: url)
    urlRequest.httpMethod = "POST"
    urlRequest.addValue("application/json", forHTTPHeaderField: "Content-Type")
    urlRequest.addValue("Bearer \(token)", forHTTPHeaderField: "Authorization")
    do {
        // is there a safe combine way to encode this
        urlRequest.httpBody = try JSONEncoder().encode(object)
    } catch {
        // Is there a better way to handle this
        return error as! AnyPublisher<ExampleObject, API.Error>
    }

    return session
        .dataTaskPublisher(for: urlRequest)
        .map(\.data)
        .decode(type: ExampleObject.self, decoder: JSONDecoder())
        .mapError { error in
            switch error {
            case is URLError:
                return API.Error.addressUnreachable
            default:
                return API.Error.invalidResponse
            }
        }
        .eraseToAnyPublisher()
}
func-create(对象:ExampleObject,令牌:令牌)->AnyPublisher{
让url=API.EndPoint.players.url
var urlRequest=urlRequest(url:url)
urlRequest.httpMethod=“POST”
urlRequest.addValue(“应用程序/json”,forHTTPHeaderField:“内容类型”)
urlRequest.addValue(“承载者\(令牌)”,用于HttpHeaderField:“授权”)
做{
//有没有一种安全的编码方式
urlRequest.httpBody=尝试JSONEncoder().encode(对象)
}抓住{
//有没有更好的方法来处理这个问题
返回错误为!AnyPublisher
}
返回会话
.dataTaskPublisher(用于:urlRequest)
.map(\.data)
.decode(类型:ExampleObject.self,解码器:JSONDecoder())
.mapError{中的错误
开关错误{
案例错误:
返回API.Error.addressUnreachable
违约:
返回API.Error.invalidResponse
}
}
.删除任何发布者()
}

没有您的
API.Error
enum,因此我创建了简单的enum

enum APIError:错误{
案例编码(编码错误)
案例请求(URL错误)
案例解码(解码错误)
案件不详
}
func-create(对象:ExampleObject,标记:String)->AnyPublisher,其中ExampleObject:Codable{
仅返回(对象)
.encode(编码器:JSONEncoder())
.mapError{error->APIRROR中的
如果let encodingError=错误为?encodingError{
return.encode(编码错误)
}否则{
返回,未知
}
}
.map{data->URLRequest在
var urlRequest=urlRequest(url:API.EndPoint.players.url)
urlRequest.httpMethod=“POST”
urlRequest.addValue(“应用程序/json”,forHTTPHeaderField:“内容类型”)
urlRequest.addValue(“承载者\(令牌)”,用于HttpHeaderField:“授权”)
urlRequest.httpBody=数据
返回URL请求
}.平面图{
URLSession.shared.dataTaskPublisher(适用于:$0)
.mapError(APIRROR.request)
.map(\.data)
.decode(类型:ExampleObject.self,解码器:JSONDecoder())
.mapError{error->APIRROR中的
如果让decodingError=错误为?decodingError{
return.decode(解码错误)
}否则{
返回,未知
}
}
}
.删除任何发布者()
}

没有您的
API.Error
enum,因此我创建了简单的enum

enum APIError:错误{
案例编码(编码错误)
案例请求(URL错误)
案例解码(解码错误)
案件不详
}
func-create(对象:ExampleObject,标记:String)->AnyPublisher,其中ExampleObject:Codable{
仅返回(对象)
.encode(编码器:JSONEncoder())
.mapError{error->APIRROR中的
如果let encodingError=错误为?encodingError{
return.encode(编码错误)
}否则{
返回,未知
}
}
.map{data->URLRequest在
var urlRequest=urlRequest(url:API.EndPoint.players.url)
urlRequest.httpMethod=“POST”
urlRequest.addValue(“应用程序/json”,forHTTPHeaderField:“内容类型”)
urlRequest.addValue(“承载者\(令牌)”,用于HttpHeaderField:“授权”)
urlRequest.httpBody=数据
返回URL请求
}.平面图{
URLSession.shared.dataTaskPublisher(适用于:$0)
.mapError(APIRROR.request)
.map(\.data)
.decode(类型:ExampleObject.self,解码器:JSONDecoder())
.mapError{error->APIRROR中的
如果让decodingError=错误为?decodingError{
return.decode(解码错误)
}否则{
返回,未知
}
}
}
.删除任何发布者()
}