我编写了一个帮助程序类,我向服务器发出了所有请求(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主体可能必须是不同的吗?
答案 0 :(得分:6)
当我读here时,发送带有GET请求的HTTP正文是针对HTTP / 1.1规范的,因此Rails不支持。我不知道,所以我将通过URL参数发送我的数据。也许其他人也会碰到这个,这可能有所帮助。
答案 1 :(得分:4)
我没有声誉,所以不能upvote但tnx非常多的解决方案和完全帮助:)这是我为swift做的:
request.HTTPBody = nil
request.addValue("0", forHTTPHeaderField: "Content-Length")