【问题标题】:NSErrorFailingURLStringKey (kCFErrorDomainCFNetwork error -1017) for specific requests针对特定请求的 NSErrorFailingURLStringKey (kCFErrorDomainCFNetwork 错误 -1017)
【发布时间】:2014-12-17 17:21:59
【问题描述】:

我编写了一个助手类,我用它向服务器发出所有请求(Rails 4.1)。这个助手类中的大多数请求都可以正常工作,但是一个特定的请求总是失败。我正在使用 Alamofire 来处理我的请求。

这是我的助手类中的一些代码:

let responseHandler = { (request: NSURLRequest, response: NSHTTPURLResponse?, object: AnyObject?, error: NSError?) -> Void in
    println("request: \(request) || response: \(response) || object: \(object) || error: \(error)")
}

// make custom request
let request = NSMutableURLRequest(URL: NSURL(string: fullPath)!)
request.HTTPBody = NSJSONSerialization.dataWithJSONObject(["session_key": "ABC"], options: nil, error: nil)
request.HTTPMethod = "GET"
request.allHTTPHeaderFields = ["Accept": "application/json", "Content-Type": "application/json"]

Alamofire.request(request).response(responseHandler)

这是上述代码中println 行的输出:

request: <NSMutableURLRequest: 0x1702007e0> { URL: http:/wolverine.movie-assistor.staging.c66.me/user } || response: nil || object: Optional(<>) || error: Optional(Error Domain=NSURLErrorDomain Code=-1017 "The operation couldn’t be completed. (NSURLErrorDomain error -1017.)" UserInfo=0x1702ea780 {NSErrorFailingURLStringKey=http://wolverine.movie-assistor.staging.c66.me/user, NSErrorFailingURLKey=http://wolverine.movie-assistor.staging.c66.me/user, _kCFStreamErrorDomainKey=4, _kCFStreamErrorCodeKey=-1, NSUnderlyingError=0x174240240 "The operation couldn’t be completed. (kCFErrorDomainCFNetwork error -1017.)"})

我尝试重置模拟器(因为我在某处读到可能是模拟器问题)并在我的 iPhone 6 上进行了尝试——但问题仍然存在。尝试使用 CocoaRESTClient 的相同 URL 效果很好,所以我怀疑这是服务器端的问题(留给预期的响应 {"session_key" : "missing"})。

有人知道是什么问题吗?

编辑#1:

在 Rails 4.1 上运行的服务器端如下所示 (application_controller.rb):

prepend_before_action :authenticate_session

def authenticate_session
  if (session_key = params[:session_key]).nil?
    forbidden(session_key: "missing")
  elsif (session = Session.find_by(session_key: session_key)).nil?
    forbidden(session_key: "unknown key")
  elsif session.open != true
    forbidden(session_key: "session closed")
  end
end

def forbidden(object = {})
  render json: make_hash(object), status: :forbidden
end

def make_hash(object)
  if object.is_a?(ActiveRecord::Base)
    return object.as_json
  end

  return object
end

编辑 #2:

与此同时,我尝试了不同的请求,结果发现服务器端的相同代码适用于除“GET”请求之外的所有请求类型(我专门尝试了 POST、PUT 和 DELETE)。那么对于 GET 请求,HTTP 正文可能必须不同?

【问题讨论】:

    标签: ios ruby-on-rails swift nsjsonserialization alamofire


    【解决方案1】:

    当我读到here 时,发送带有 GET 请求的 HTTP 正文违反了 HTTP/1.1 规范,因此 Rails 不支持。我不知道,所以我将通过 URL 参数发送我的数据。也许其他人也遇到过这个问题,这可能会有所帮助。

    【讨论】:

      【解决方案2】:

      我没有声望,所以不能投票,但 tnx 非常需要解决方案并且完全有帮助:) 这是我为 swift 所做的:

      request.HTTPBody = nil
      request.addValue("0", forHTTPHeaderField: "Content-Length")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-02-09
        • 2014-08-01
        • 2011-06-22
        • 1970-01-01
        • 2014-08-28
        • 1970-01-01
        • 2020-08-17
        相关资源
        最近更新 更多