Swift NSMutableURLRequest.HTTPMethod未设置正确的方法
我向API发出了此请求,该API应发布一些json:Swift NSMutableURLRequest.HTTPMethod未设置正确的方法,swift,nsurlsession,nsurlrequest,Swift,Nsurlsession,Nsurlrequest,我向API发出了此请求,该API应发布一些json: class func makeAPICall (serializedJSONObject contentMap: Dictionary<String, String>, completion: ((data: NSData?, response: NSURLResponse?, error: NSError?) -> Void)) throws -> Void { var jsonData: NSDat
class func makeAPICall (serializedJSONObject contentMap: Dictionary<String, String>, completion: ((data: NSData?, response: NSURLResponse?, error: NSError?) -> Void)) throws -> Void {
var jsonData: NSData
do {
jsonData = try NSJSONSerialization.dataWithJSONObject(contentMap, options: NSJSONWritingOptions())
var jsonString = NSString(data: jsonData, encoding: NSUTF8StringEncoding) as! String
print(jsonString)
jsonString = jsonString.stringByAddingPercentEncodingForFormUrlencoded()!
print(jsonString)
jsonData = jsonString.dataUsingEncoding(NSUTF8StringEncoding)!
let postsEndpoint: String = "https://www.example.com/api/v2"
guard let postsURL = NSURL(string: postsEndpoint) else {
throw APICallError.other("cannot create URL")
}
let postsURLRequest = NSMutableURLRequest(URL: postsURL)
print(jsonData)
postsURLRequest.HTTPBody = jsonData
print(postsURLRequest)
postsURLRequest.HTTPMethod = "POST"
let config = NSURLSessionConfiguration.defaultSessionConfiguration()
let session = NSURLSession(configuration: config)
let task = session.dataTaskWithRequest(postsURLRequest, completionHandler: {
(data, response, error) in
completion(data: data, response: response, error: error)
})
task.resume() //starts the request. It's called resume() because a session starts in a suspended state
} catch {
print("lol, problem")
}
}
现在我还有一个简单的测试页面来测试json请求:
<form action="v2/" method="post">
<textarea name="data" rows="20" cols="80"></textarea>
<input type="submit" />
</form>
(请注意,请求主体也是空的,但我将对此提出一个不同的问题)
html表单请求日志:
GET /api/v2/ HTTP/1.1
HTTP headers:
Host: www.example.com
Accept: */\*
Cookie: PHPSESSID=vd61qutdll216hbs3a677fgsq4
User-Agent: KM%20registratie%20tabbed%20NL/1 CFNetwork/758.2.8 Darwin/15.2.0
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: keep-alive
Request body:
POST /api/v2/ HTTP/1.1
HTTP headers:
Host: www.example.com
Origin: http://www.example.com
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/\*;q=0.8
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/601.3.9 (KHTML, like Gecko) Version/9.0.2 Safari/601.3.9
Referer: http://www.example.com/api/test.php
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Request body:
data=%7B%22action%22%3A+%22vehicleRecords%22%2C%0D%0A%22token%22%3A+%22token_04e01fdc78205f0f6542bd523519e12fd3329ba9%22%2C%0D%0A%22vehicle%22%3A+%22vehicle_e5b79b2e%22%7D
你能先试试这个吗
if let postEndpoint: NSURL = NSURL(string: "https://www.example.com/api/v2") {
let postURLRequest: NSMutableURLRequest = NSMutableURLRequest(URL: postEndpoint)
postURLRequest.HTTPMethod = "POST"
postURLRequest.HTTPBody = UTF8EncodedJSON
NSURLSession.sharedSession().dataTaskWithRequest(postURLRequest, completionHandler: { (data: NSData?, response: NSURLResponse?, error: NSError?) -> Void in
}).resume()
}
我只发现我们每个人处理代码的方式有两个不同之处,但看看post对我来说是如何工作的,我将发布它,并希望它可能有用 配置和请求如下所示:
let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
let a = apiString.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLHostAllowedCharacterSet())
let request = NSMutableURLRequest(URL: NSURL(string: Utilities.getTranslation("websiteG") + a!)!)
不过你的方法要干净得多,所以不要用它
之后,我只在已经设置了主体之后才应用该方法,尽管我真的怀疑稍后设置该方法是否会修复它
if method == "POST" || method == "PUT" {
request.HTTPBody = post!.dataUsingEncoding(NSUTF8StringEncoding)
}
request.HTTPMethod = method
最后但并非最不重要的是NSURLSession的制作和使用:
func httpRequest(configuration: NSURLSessionConfiguration, request: NSURLRequest!, callback: (NSData?, String?) -> Void) {
let session = NSURLSession(configuration: configuration,
delegate: self,
delegateQueue: NSOperationQueue.mainQueue())
task = session.dataTaskWithRequest(request) {
(data: NSData?, response: NSURLResponse?, error: NSError?) -> Void in
if error != nil {
callback(nil, "\(error!.code)")
} else {
let result = NSData(data: data!)
callback(result, nil)
}
}
task.resume()
}
我真正看到的唯一区别是,我分配了委托,并且使用了函数“dataTaskWithRequest:”而不是“dataTaskWithRequest:completionHandler:”
我真的不知道您的问题的答案是否在这里,但如果您想知道我仍然实现了哪些委托方法,您可以试一试:“URLSession:didReceiveChallenge:completionHandler:”和“URLSession:task:willperformhtpredirection:newRequest:completionHandler:”虽然我不认为他们会被炒鱿鱼,所以我很确定你可以忽略委派代表的问题
编辑:我将只编写整个函数
func apiCall(method: String = "GET", post: String? = nil, apiString: String, success: (JSONData: NSData!, cancel: Bool!) -> Void) {
UIApplication.sharedApplication().networkActivityIndicatorVisible = true
let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
//website string
let a = apiString.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLHostAllowedCharacterSet())
let request = NSMutableURLRequest(URL: NSURL(string: Utilities.getTranslation("websiteG") + a!)!)
print(request)
//Define a new API object
let learn = API()
//Here is supposed to be some code for creating the base64 authorization string, but because it's not important I decided to remove it.
//Check if it's sending extra information with the call
if method == "POST" || method == "PUT" {
request.HTTPBody = post!.dataUsingEncoding(NSUTF8StringEncoding)
}
request.HTTPMethod = method
//Perform request to the api
configuration.HTTPAdditionalHeaders = ["Authorization": authString]
learn.httpRequest(configuration, request: request, callback:{(data, error) -> Void in
UIApplication.sharedApplication().networkActivityIndicatorVisible = false
if let urlData = data {
success(JSONData: urlData, cancel: false)
//Gives back an NSData that can be used for reading data
} else {
if error == "-1009" {
self.delegate?.viewShouldDismissLoading()
}
success(JSONData: nil, cancel: true)
}
})
}
url后面应该有一个正斜杠:
“www.example.com/api/v2/”
您好,是否可以访问GitHub上的项目,或者类似的东西?UTF8EncodedJSON,是NSData类型的吗?是的(如果不是,则不会编译)。还有,为什么这会改变HTTPMethod?首先,我的朋友,冷静点。。。我想帮你。。。好啊我不知道你尝试了什么…哈哈,我真的不明白你被什么冒犯了…我正在调用task.resume()
,我想这没什么区别吧?区别在于不使用此NSURLSessionConfiguration.defaultSessionConfiguration()。。。我想尝试一下defaultSesstionConfiguration是否覆盖POST以获取您的POST
变量来自何处?我想你指的是与a
相同的变量,但我不确定。。另外,我已经尝试在正文后设置方法,但实际上没有改变任何东西:(我用完整的代码更新了问题。也许你可以在另一部分中找到问题。我的post变量是一个可选字符串,我传递给我的函数是“apiCall(method:string=“GET”,post:string?=nil,apiString:string,success:(JSONData:NSData!,cancel:Bool!)->Void)”。但是,我找不到任何区别:(假设这是api中的一个错误,而不是Swift代码中的错误。哦,很高兴你得到了它。是的。我有点知道现在发生了什么,但让我们先别说它是用PHP:p制作的api
func apiCall(method: String = "GET", post: String? = nil, apiString: String, success: (JSONData: NSData!, cancel: Bool!) -> Void) {
UIApplication.sharedApplication().networkActivityIndicatorVisible = true
let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
//website string
let a = apiString.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLHostAllowedCharacterSet())
let request = NSMutableURLRequest(URL: NSURL(string: Utilities.getTranslation("websiteG") + a!)!)
print(request)
//Define a new API object
let learn = API()
//Here is supposed to be some code for creating the base64 authorization string, but because it's not important I decided to remove it.
//Check if it's sending extra information with the call
if method == "POST" || method == "PUT" {
request.HTTPBody = post!.dataUsingEncoding(NSUTF8StringEncoding)
}
request.HTTPMethod = method
//Perform request to the api
configuration.HTTPAdditionalHeaders = ["Authorization": authString]
learn.httpRequest(configuration, request: request, callback:{(data, error) -> Void in
UIApplication.sharedApplication().networkActivityIndicatorVisible = false
if let urlData = data {
success(JSONData: urlData, cancel: false)
//Gives back an NSData that can be used for reading data
} else {
if error == "-1009" {
self.delegate?.viewShouldDismissLoading()
}
success(JSONData: nil, cancel: true)
}
})
}