我真的很想合并,并且一直困扰着这个问题。我有基本的注册表单,如果一切正常,则返回带有200个代码的空响应,如果表单存在某些注册失败,则返回442。
那是可以处理空响应并且可以正常工作的代码
<div [formGroup]="form">
<div formArrayName="{{ field.name }}">
<div *ngFor="let frm of formArray.controls; index as idx">
<div formGroupName="{{ idx }}">
<div *ngFor="let obj of arrayFileds;">
<input
attr.type="{{ obj.type }}"
class="form-control"
placeholder="{{ obj.name }}"
id="{{ obj.name }}"
name="{{ obj.name }}"
formControlName="{{ obj.name }}"
/>
</div>
<hr />
</div>
</div>
</div>
</div>
但是,如何退回其他类型的发布商?例如
idx
我的网络通话:
extension Route where ResultType: EmptyResult {
func emptyResult() -> AnyPublisher<Void, APIError> {
return URLSession.shared.dataTaskPublisher(for: urlRequest)
.print("EMPTY RESULT")
.tryMap { data, response in
guard let httpResponse = response as? HTTPURLResponse else { throw APIError.nonHttpResponse(description: "Not http resp") }
let statusCode = httpResponse.statusCode
guard (200..<300).contains(statusCode) else { throw APIError.nonHttpResponse(description: "bad response")
}
return Void()
}.mapError { error in
print("Error \(error)")
return .network(description: error.localizedDescription)
}
.eraseToAnyPublisher()
}
}
答案 0 :(得分:1)
因此,您有一个网络请求,在请求成功的情况下,将返回200响应和一个空主体,而在出现表单错误的情况下,它将返回特定的状态码和响应中的错误。
我建议您将Output
的{{1}}类型保留为Publisher
,但是,如果出现格式错误,请解码错误并将其作为{{1 }}。
Void
然后,您可以通过APIError
中的struct LoginError: Decodable {
let usernameError: String
let emailError: String
}
enum APIError: Error {
case failureStatus(code: Int)
case login(LoginError)
case nonHttpResponse(description: String)
case network(Error)
}
func emptyResult() -> AnyPublisher<Void, APIError> {
return URLSession.shared.dataTaskPublisher(for: urlRequest)
.print("EMPTY RESULT")
.tryMap { data, response in
guard let httpResponse = response as? HTTPURLResponse else { throw APIError.nonHttpResponse(description: "Not http response") }
let statusCode = httpResponse.statusCode
guard (200..<300).contains(statusCode) else {
if statusCode == 442 {
let loginError = try JSONDecoder().decode(LoginError.self, from: data)
throw APIError.login(loginError)
} else {
throw APIError.failureStatus(code: statusCode)
}
}
return Void()
}.mapError { error in
switch error {
case let apiError as APIError:
return apiError
default:
return .network(error)
}
}
.eraseToAnyPublisher()
}
遍历switch
来处理特定错误:
error