Swift 2: Alamofire GET Issue - swift2

I'm trying to perform a GET request but am getting the following two errors:
use of unresolved identifier 'self'
and
Expected declaration
This is my affected code
let credentialData = "\(self._username):\(self._password)".dataUsingEncoding(NSUTF8StringEncoding)!
let base64Credentials = credentialData.base64EncodedStringWithOptions([])
let headers = ["Authorization": "Basic \(base64Credentials)"]
Alamofire.request(.GET, "http://gemcave.pythonanywhere.com/api/order\(self._username)/\(self._password)", headers: headers)
.responseJSON { response in
debugPrint(response)
}

You need to put your code into some method like this:
func networkConfiguration() {
let credentialData = "\(self._username):\(self._password)".dataUsingEncoding(NSUTF8StringEncoding)!
let base64Credentials = credentialData.base64EncodedStringWithOptions([])
let headers = ["Authorization": "Basic \(base64Credentials)"]
Alamofire.request(.GET, "http://gemcave.pythonanywhere.com/api/order\(self._username)/\(self._password)", headers: headers)
.responseJSON { response in
debugPrint(response)
}
}

Related

Alamofire post serialization error

I am trying to make a HTTP Post using alamofire, below is my code:
#IBAction func loginUserBtn(_ sender: Any) {
let urlAddress = "http://xx.xx.xx.xx:xx/xx/xx/xx/login"
let pass = Array(userPassword.text!)
let username = userEmail.text!
let params : [String: Any] = ["username": username, "pwd": pass]
print(params)
let headers: HTTPHeaders = [
"Accept": "application/json",
"Content-Type": "application/json"
]
Alamofire.request(urlAddress, method: .post, parameters: params, encoding: URLEncoding.default, headers: headers).responseJSON{
responds in
if responds.result.isSuccess{
print("Succesfull")
let LoginJSON : JSON = JSON(responds.result.value!)
//self.updateWeatheData(json: weatherJSON)
print(LoginJSON)
}
else{
print("Error \(String(describing: responds.result.error))")
}
}
}
This is the error I'm getting but if I change responseJSON to responseString I get a success, but the server is rejecting my data.
Here is my error message:
Error Optional(Alamofire.AFError.responseSerializationFailed(Alamofire.AFError.ResponseSerializationFailureReason.jsonSerializationFailed(Error Domain=NSCocoaErrorDomain Code=3840 "Invalid value around character 0." UserInfo={NSDebugDescription=Invalid value around character 0.})))
encoding: URLEncoding.default
I see what you have header of content-type is JSON, but Encoding field inform in what type your params. Try this:
encoding: JSONEncoding.default

Not getting result in NSURLSession in swift

In using swift 2.2, while using NSURLSession I am not getting the Response. What am I doing wrong?
I have to pass parameters and header in POST request.
func API() {
let userName:String! = "uname"
let password:String! = "password"
let request = NSMutableURLRequest(URL: NSURL(string: URL)!)
request.HTTPMethod = "POST"
let data = try! NSJSONSerialization.dataWithJSONObject(parameter, options:[])
let json = NSString(data: data, encoding: NSUTF8StringEncoding) as! String
request.HTTPBody = json.dataUsingEncoding(NSUTF8StringEncoding)
request.allHTTPHeaderFields = ["key":"value"]
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { data, response, error in
guard error == nil && data != nil else { // check for fundamental networking error
print("error=\(error)")
return
}
if let httpStatus = response as? NSHTTPURLResponse where httpStatus.statusCode != 200 { // check for http errors
print("statusCode should be 200, but is \(httpStatus.statusCode)")
print("response = \(response)")
}
let responseString = String(data: data!, encoding: NSUTF8StringEncoding)
print("responseString = \(responseString)")
}
task.resume()
}
Result is:
responseString = Optional("")
Did you call this service on any REST client like Postman ? if yes and get response so try replace this line
request.allHTTPHeaderFields = ["key":"value"]
with this
request.setValue("value",forHTTPHeaderField:"Key")
and set all values

how to make http post json request params using swift 2.0

i need to send the json request parameters to the server using nsurl session in swift2.0. i don't know how to create the json request params.i created the params like this
let jsonObj = ["Username":"Admin", "Password":"123","DeviceId":"87878"]
// print("Params are \(jsonObj)")
//request.HTTPBody = try! NSJSONSerialization.dataWithJSONObject(jsonObj, options: [])
// or if you think the conversion might actually fail (which is unlikely if you built `params` yourself)
do {
request.HTTPBody = try NSJSONSerialization.dataWithJSONObject(jsonObj, options:.PrettyPrinted)
} catch {
print(error)
}
but its not ping to the method body so i am getting the failure response
Try the below code.
let parameters = ["Username":"Admin", "Password":"123","DeviceId":"87878"] as Dictionary<String, String>
let request = NSMutableURLRequest(URL: NSURL(string:YOURURL)!)
let session = NSURLSession.sharedSession()
request.HTTPMethod = "POST"
//Note : Add the corresponding "Content-Type" and "Accept" header. In this example I had used the application/json.
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("application/json", forHTTPHeaderField: "Accept")
request.HTTPBody = try! NSJSONSerialization.dataWithJSONObject(parameters, options: [])
let task = session.dataTaskWithRequest(request) { data, response, error in
guard data != nil else {
print("no data found: \(error)")
return
}
do {
if let json = try NSJSONSerialization.JSONObjectWithData(data!, options: []) as? NSDictionary {
print("Response: \(json)")
} else {
let jsonStr = NSString(data: data!, encoding: NSUTF8StringEncoding)// No error thrown, but not NSDictionary
print("Error could not parse JSON: \(jsonStr)")
}
} catch let parseError {
print(parseError)// Log the error thrown by `JSONObjectWithData`
let jsonStr = NSString(data: data!, encoding: NSUTF8StringEncoding)
print("Error could not parse JSON: '\(jsonStr)'")
}
}
task.resume()
Hope it works for you!!

running 2 tasks on one NSURLSession.sharedSession

I am trying to do 2 HTTP requests
in the first request i will get a var that will be used in the second request.
My problem is when I do it using the code below it just runs the second request without running the first.
let url = NSURL(string:"https://loginurl")
let cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringLocalCacheData
let request = NSMutableURLRequest(URL: url!, cachePolicy: cachePolicy, timeoutInterval: 2.0)
request.HTTPMethod = "POST"
let contentType = " application/x-www-form-urlencoded"
NSURLProtocol.setProperty(contentType, forKey: "Content-Type", inRequest: request)
var dataString = "user details"
var requestBodyData = (dataString as NSString).dataUsingEncoding(NSUTF8StringEncoding)
request.HTTPBody = requestBodyData
NSURLProtocol.setProperty(requestBodyData!.length, forKey: "Content-Length", inRequest: request)
var response: NSURLResponse?
let session = NSURLSession.sharedSession()
var task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in
//code for getting the session id to be used in the second request
})
task.resume()
let url2 = NSURL(string:"http://url2?sessionid")
let request2 = NSMutableURLRequest(URL: url2!, cachePolicy: cachePolicy, timeoutInterval: 2.0)
request2.HTTPMethod = "GET"
dataString=""
requestBodyData = (dataString as NSString).dataUsingEncoding(NSUTF8StringEncoding)
request2.HTTPBody = requestBodyData
NSURLProtocol.setProperty(contentType, forKey: "Content-Type", inRequest: request2)
task = session.dataTaskWithRequest(request2, completionHandler: {data, response, error -> Void in
})
task.resume()
Can anybody explain what can be wrong with this code
Problem 2:
let task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in
if let httpRes = response as? NSHTTPURLResponse {
let html = NSString(data:data!, encoding:NSUTF8StringEncoding)
if let match = html?.rangeOfString("(?<=sessionid=')[^\';]+", options: .RegularExpressionSearch) {
portalid = (html?.substringWithRange(match))!
}
}
When I run in simulator it works without issues but when I debug it on iPhone it crashes showing this error "Terminating app due to uncaught exception 'NSRangeException', reason: '-[__NSCFString substringWithRange:]: Range {9223372036854775807, 0} out of bounds; string length 52427'"
Thanks
Here is code sample which makes two requests:
//: Playground - noun: a place where people can play
import UIKit
import XCPlayground
XCPlaygroundPage.currentPage.needsIndefiniteExecution = true
let session = NSURLSession.sharedSession()
session.dataTaskWithURL(NSURL(string: "http://www.google.com")!, completionHandler: { (data :NSData?, response :NSURLResponse?, error :NSError?) -> Void in
let res = NSString(data: data!, encoding: NSUTF8StringEncoding)
print(res!)
// make a new request here
let innerSession = NSURLSession.sharedSession()
innerSession.dataTaskWithURL(NSURL(string: "http://www.google.com")!, completionHandler: { (data :NSData?, response :NSURLResponse?, error :NSError?) -> Void in
let res = NSString(data: data!, encoding: NSUTF8StringEncoding)
print(res!)
}).resume()
}).resume()

Swift callback in dataTaskWithRequest

New to Swift and trying to write a login screen for my app.
My controller:
#IBAction func loginButton(sender: UIButton) {
let emailAddress = emailTextField.text
let password = passwordTextField.text
let api = Api()
api.authenticate(emailAddress!, password: password!)
}
Api class:
class Api {
func authenticate(username: String, password: String) -> Bool {
var params = [String: String]()
params["username"] = username
params["password"] = password
params["grant_type"] = "password"
var headers = [String: String]()
headers["Content-Type"] = "application/x-www-form-urlencoded"
post("authenticate", params: params, headers: headers) {data, response in
// do something
}
}
func post(location: String, params: [String: String], headers: [String: String], callback: ((data: NSString!, response: NSHTTPURLResponse) -> Void)) {
let request = NSMutableURLRequest()
let session = NSURLSession.sharedSession()
request.URL = NSURL(string: Configuration.apiBaseUrl + location)
request.HTTPMethod = "POST"
request.HTTPBody = NSString(string: getPostBody(params)).dataUsingEncoding(NSUTF8StringEncoding)
request.addValue("Basic " + Configuration.apiAuthorization, forHTTPHeaderField: "Authorization")
for (key, value) in headers {
request.addValue(value, forHTTPHeaderField: key)
}
let task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in
let data = NSString(data: data!, encoding: NSUTF8StringEncoding)
let httpResponse = response as! NSHTTPURLResponse
callback(data: data, response: httpResponse)
return
})
task.resume()
}
}
As I plan to add more API methods after authentication, I want generic POST/PUT/GET/DELETE methods. I am trying to understand how I can best set up the callbacks in Swift so the post call in the authenticate method can return true/false and show like a dialog on the UI thread. Returning a boolean in the post call in the authenticate method is not allowed now, because it expects Void.
I am familiar with callbacks in nodejs and trying to grasp this now. Any hints what the best approach would be?

Resources