4

我编写了一个助手类,我用它向服务器发出所有请求(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 上进行了尝试——但问题仍然存在。尝试使用相同的 URLCocoaRESTClient工作正常,所以我怀疑这是服务器端的问题(留给预期的响应{"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 正文可能必须不同?

4

2 回答 2

8

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

于 2014-12-17T17:57:17.340 回答
5

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

request.HTTPBody = nil
request.addValue("0", forHTTPHeaderField: "Content-Length")
于 2015-02-05T11:23:13.043 回答