-1103 错误域=NSURLErrorDomain 代码=-1103 "resource exceeds maximum size" iOS 13
-1103 Error Domain=NSURLErrorDomain Code=-1103 "resource exceeds maximum size" iOS 13
当 iOS 13 上的响应有点大 (14kb) 时,我们面临以下网络错误。
[-1103] Error Domain=NSURLErrorDomain Code=-1103 "resource exceeds maximum size"
因为我们使用的是 Alamofire,所以这个问题被视为错误结果,这破坏了我们对结果的处理。
奇怪的是,如果我们直接使用NSURLSession,虽然从日志中仍然可以看到这个错误,但实际上我们并没有在
的回调中收到它
session.dataTask(with: request) { value, response, error in ... }
所以结果可以正确处理。
这个问题以前没见过。有人对此有所了解吗?
终于找到答案了。对于 GET 服务,我试图添加一个 httpBody。像这样:
do {
request.httpBody = try JSONSerialization.data(withJSONObject: parameters, options: .prettyPrinted)
} catch let error {
errorCompletion(error)
return
}
解决方案只是添加一个 if 以避免在 httpMethod 是 GET 时出现该代码块。似乎 iOS 13 新行为和 Swift 给出的错误消息绝对没有帮助
在 Slack 社区的帮助下,我们找到了答案
on iOS13, it is not allowed to add a body in GET request.
要让它再次工作,我们可以切换到 POST/PUT 请求或通过 GET 请求的 url 参数添加正文值。
Alamofire:你应该试试这个!
Alamofire.request(urlString, method: .get, parameters: parameters, encoding: URLEncoding.queryString)
只是避免 httpBody
用于 GET
API 请求。
if requestType != .get{
request.httpBody = data
}
#或
对于 GET
请求将参数附加到 URL 而不是 HTTP body
使用以下扩展从字典创建查询参数。
extension NSObject {
func buildQueryString(fromDictionary parameters: [String:String]) -> String {
var urlVars = [String]()
for (var k, var v) in parameters {
let characters = (CharacterSet.urlQueryAllowed as NSCharacterSet).mutableCopy() as! NSMutableCharacterSet
characters.removeCharacters(in: "&")
v = v.addingPercentEncoding(withAllowedCharacters: characters as CharacterSet)!
k = k.addingPercentEncoding(withAllowedCharacters: characters as CharacterSet)!
urlVars += [k + "=" + "\(v)"]
}
return (!urlVars.isEmpty ? "?" : "") + urlVars.joined(separator: "&")
}
}
我只在使用 Xcode 11 构建时看到此问题。如果我恢复到 Xcode 10.3,我将不再遇到同样的问题。虽然不是永久修复,但如果您需要推出代码,您可以恢复,直到您有时间修复它。
我遇到这个问题是因为我在发送获取请求时在 Alamofire 中传递了空参数。所以,我没有发送空参数,而是简单地将它替换为 nil。
在 GET
请求中传递查询参数,如下所示:
let parameters: Parameters = [
"param": value
]
Alamofire.request(urlString, method: .get, parameters: parameters, encoding: URLEncoding.queryString)
我使用默认 url 编码而不是默认 json 编码,它对我有用。
Alamofire.request(url, method: .get, parameters: param, encoding: URLEncoding.default)
或
如果您使用 URLRequestConvertible
enum NetworkRouter: URLRequestConvertible {
case someCase(lang:String)
var method: HTTPMethod {
return .get
}
var parameters: Parameters? {
switch self {
case .someCase(let param):
return ["lang": param.lang]
default:
return nil
}
}
var url: URL {
switch self {
case .someCase(let param):
return URL(string: Constants.baseURL + Constants.endPoint)!
default:
return URL(string: Constants.baseURL)!
}
}
var encoding: ParameterEncoding {
return URLEncoding.default
}
func asURLRequest() throws -> URLRequest {
var urlRequest = URLRequest(url: url)
urlRequest.httpMethod = method.rawValue
return try encoding.encode(urlRequest, with: parameters)
}
}
我遇到了同样的问题,正在寻找解决方案。
使用 GET 时不能在正文中传递参数。
如果 API 支持,则使用 POST 方法,或者像下面那样在 URL 中传递它。
AnyURL?Parameter=Value&Parameter=Value
我的解决方法是只将 .parameters
设置为 nil,然后一切正常。因为在Swift里面还是初始化了.parameters
.
的值
self.request.parameters = nil
此处您可能遗漏了要传递给数据任务的 URL 请求的方法。您必须将 POST/PUT/DELETE 添加到 URL 请求方法参数,如下所示。
var request: URLRequest = URLRequest(url: SOME_VALID_URL)
request.body = SOME_VALID_DATA_IN_BYTES
request.method = "post" --> You are missing this.
当 iOS 13 上的响应有点大 (14kb) 时,我们面临以下网络错误。
[-1103] Error Domain=NSURLErrorDomain Code=-1103 "resource exceeds maximum size"
因为我们使用的是 Alamofire,所以这个问题被视为错误结果,这破坏了我们对结果的处理。
奇怪的是,如果我们直接使用NSURLSession,虽然从日志中仍然可以看到这个错误,但实际上我们并没有在
的回调中收到它session.dataTask(with: request) { value, response, error in ... }
所以结果可以正确处理。
这个问题以前没见过。有人对此有所了解吗?
终于找到答案了。对于 GET 服务,我试图添加一个 httpBody。像这样:
do {
request.httpBody = try JSONSerialization.data(withJSONObject: parameters, options: .prettyPrinted)
} catch let error {
errorCompletion(error)
return
}
解决方案只是添加一个 if 以避免在 httpMethod 是 GET 时出现该代码块。似乎 iOS 13 新行为和 Swift 给出的错误消息绝对没有帮助
在 Slack 社区的帮助下,我们找到了答案
on iOS13, it is not allowed to add a body in GET request.
要让它再次工作,我们可以切换到 POST/PUT 请求或通过 GET 请求的 url 参数添加正文值。
Alamofire:你应该试试这个!
Alamofire.request(urlString, method: .get, parameters: parameters, encoding: URLEncoding.queryString)
只是避免 httpBody
用于 GET
API 请求。
if requestType != .get{
request.httpBody = data
}
#或
对于 GET
请求将参数附加到 URL 而不是 HTTP body
使用以下扩展从字典创建查询参数。
extension NSObject {
func buildQueryString(fromDictionary parameters: [String:String]) -> String {
var urlVars = [String]()
for (var k, var v) in parameters {
let characters = (CharacterSet.urlQueryAllowed as NSCharacterSet).mutableCopy() as! NSMutableCharacterSet
characters.removeCharacters(in: "&")
v = v.addingPercentEncoding(withAllowedCharacters: characters as CharacterSet)!
k = k.addingPercentEncoding(withAllowedCharacters: characters as CharacterSet)!
urlVars += [k + "=" + "\(v)"]
}
return (!urlVars.isEmpty ? "?" : "") + urlVars.joined(separator: "&")
}
}
我只在使用 Xcode 11 构建时看到此问题。如果我恢复到 Xcode 10.3,我将不再遇到同样的问题。虽然不是永久修复,但如果您需要推出代码,您可以恢复,直到您有时间修复它。
我遇到这个问题是因为我在发送获取请求时在 Alamofire 中传递了空参数。所以,我没有发送空参数,而是简单地将它替换为 nil。
在 GET
请求中传递查询参数,如下所示:
let parameters: Parameters = [
"param": value
]
Alamofire.request(urlString, method: .get, parameters: parameters, encoding: URLEncoding.queryString)
我使用默认 url 编码而不是默认 json 编码,它对我有用。
Alamofire.request(url, method: .get, parameters: param, encoding: URLEncoding.default)
或
如果您使用 URLRequestConvertible
enum NetworkRouter: URLRequestConvertible {
case someCase(lang:String)
var method: HTTPMethod {
return .get
}
var parameters: Parameters? {
switch self {
case .someCase(let param):
return ["lang": param.lang]
default:
return nil
}
}
var url: URL {
switch self {
case .someCase(let param):
return URL(string: Constants.baseURL + Constants.endPoint)!
default:
return URL(string: Constants.baseURL)!
}
}
var encoding: ParameterEncoding {
return URLEncoding.default
}
func asURLRequest() throws -> URLRequest {
var urlRequest = URLRequest(url: url)
urlRequest.httpMethod = method.rawValue
return try encoding.encode(urlRequest, with: parameters)
}
}
我遇到了同样的问题,正在寻找解决方案。
使用 GET 时不能在正文中传递参数。
如果 API 支持,则使用 POST 方法,或者像下面那样在 URL 中传递它。
AnyURL?Parameter=Value&Parameter=Value
我的解决方法是只将 .parameters
设置为 nil,然后一切正常。因为在Swift里面还是初始化了.parameters
.
self.request.parameters = nil
此处您可能遗漏了要传递给数据任务的 URL 请求的方法。您必须将 POST/PUT/DELETE 添加到 URL 请求方法参数,如下所示。
var request: URLRequest = URLRequest(url: SOME_VALID_URL)
request.body = SOME_VALID_DATA_IN_BYTES
request.method = "post" --> You are missing this.