Добрый день. Понимаю, что тема довольно обширная, но может кто-нибудь объяснить, как делать запросы get и post? Допустим, есть post запрос на авторизацию …/auth/signIn, есть две переменных - email и password, которые содержат данные для авторизации. Как их передать на сервер? Можно ли это сделать при помощи swiftyJSON?
Как сделать post запрос api
Спасибо! Думаю, это то, что надо. Только еще один вопрос: как добавить это в свой проект?
Я делаю get запрос с мопощью этой библиотеки
do {
let opt = try HTTP.GET("http://.../universities/getUniversities", parameters: ["title": title])
opt.start { response in
if let err = response.error {
print("error: \(err.localizedDescription)")
return //also notify app of failure as needed
}
print("opt finished: \(response.description)")
}
} catch let error {
print("got an error creating the request: \(error)")
}
Получаю ответ от сервера:
Payload:
[{“title”:“СПБГЭТУ, ЛЭТИ”,“id”:“56cf79c06c3372439ad3cd51”}]
Как можно передать значение title и id в переменные, чтобы дальше ими пользоваться?
По всей видимости вы получаете в ответ json, который находиться в response.data.
Как работать с json можно посмотреть например здесь
Спрошу тут)). Делаю POST запрос через SwiftHTTP
func getLogin(completion: (objects: [JSON]) -> ()) {
do {
let params = ["{\"type\": \"android\", \"token\": \"string\"}" ] //["type": "android", "token": "1234"]
//let opt = try HTTP.POST("https://domain.com/new", parameters: params)
try HTTP.POST("\(serverURL)/aktsionka/login", parameters: params).start { response in
if let jsonDict = JSON(data: response.data).dictionary {
let clearJSON = JSON(data: response.data, options: NSJSONReadingOptions.MutableContainers, error: nil )
let photo = clearJSON["object"]
print(params)
print(clearJSON)
NSOperationQueue.mainQueue().addOperationWithBlock {
// completion(objects: clearJSON["object"]["photos"].array!)
}
}
}
} catch {
print(error)
}
}
В ответ ошибка получения json класса.
Я понял почему. Тело запроса должно быть: {“type”: “android”, “token”: “string”} то есть JSON объект
Но параметр HTTP в квадратных скобках. Как быть?
Ну если ПОСТ, то по идее вы параметры в заголовках передаете! Пришлите строку для входа в АПИ, нужные параметры для передачи, я напишу методу и покажу вам. Просто нужно установить заголовки и будет счастье. NSURLSession прекрасносно с этим справляется
Вы параметры неправильно передаете, попробуйте так:
func getLogin(completion: (objects: [JSON]) -> ()) {
do {
let params = ["type": "android", "token": "1234"]
try HTTP.POST("\(serverURL)/aktsionka/login", parameters: params, requestSerializer: JSONParameterSerializer()).start { response in
if let jsonDict = JSON(data: response.data).dictionary {
}
}
} catch {
print(error)
}
}
Спасибо, так работает. Я так понимаю фишка в этом requestSerializer: JSONParameterSerializer()
Это пример на будущее, как штатными средствами можно выполнить POST-запрос, может кому пригодится
class RecuestMethodForPOST {
func sendRequest(callback:(result: AnyObject?) -> Void ) {
// Устанавливаем сессию как обычно
let sessionConfig = NSURLSessionConfiguration.defaultSessionConfiguration()
let session = NSURLSession(configuration: sessionConfig, delegate: nil, delegateQueue: nil)
// Выходим если не удалось инициировать УРЛ из строки
guard var URL = NSURL(string: "https://api.ru/api/v1/register") else {return}
let request = NSMutableURLRequest(URL: URL)
// Формируем запрос для метода POST
request.HTTPMethod = "POST"
// Устанавливаем заголовки запроса
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
// Само тело запроса
let bodyObject = [
"app": "<ключ для приложения>",
"username": "<параметр имя пользователя>",
"email": "<параметр почтыl>",
"password": "<передаем пароль>",
"cli": "<еще парамет>",
"doc": [
"firstField": "Что то записали в поле",
"secondField": "Еще одна запись в поле на сервере"
]
]
// Устанавливаем тело в запросе
request.HTTPBody = try! NSJSONSerialization.dataWithJSONObject(bodyObject, options: [])
let task = session.dataTaskWithRequest(request, completionHandler: { (data: NSData?, response: NSURLResponse?, error: NSError?) -> Void in
if (error == nil) {
// Ну а здесь можно помимо заголовков передату дату в тот же SwiftyJSON и распарсить
let statusCode = (response as! NSHTTPURLResponse).statusCode
print("URL Session Task Succeeded: HTTP \(statusCode)")
callback(result: "your result")
} else {
// Обработка ошибки коннекта
print("URL Session Task Failed: %@", error!.localizedDescription);
callback(result: "\(error!.localizedDescription)")
}
})
task.resume()
} // sendRequest
} // class RecuestMethodForPOST
Помогите составить запрос для получения данных с сайта producthunt.com.
Необходимо получить товары на сегодня для выбранной категории.
Описание: https://api.producthunt.com/v1/docs