特定请求的NSErrorFailingURLStringKey(kCFErrorDomainCFNetwork错误-1017)

时间:2014-12-17 17:21:59

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

我编写了一个帮助程序类,我向服务器发出了所有请求(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的相同网址工作正常,因此我怀疑它是服务器端的问题(留给预期的响应{"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:

同时我尝试了不同的请求,结果是服务器端的相同代码适用于所有请求类型,除了&#34; GET&#34;请求(我特意尝试了POST,PUT和DELETE)。那么对于GET请求,HTTP主体可能必须是不同的吗?

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:4)

我没有声誉,所以不能upvote但tnx非常多的解决方案和完全帮助:)这是我为swift做的:

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