Как сделать post запрос api

api
privateapi
swift
xcode

#1

Добрый день. Понимаю, что тема довольно обширная, но может кто-нибудь объяснить, как делать запросы get и post? Допустим, есть post запрос на авторизацию …/auth/signIn, есть две переменных - email и password, которые содержат данные для авторизации. Как их передать на сервер? Можно ли это сделать при помощи swiftyJSON?


#2

Попробуйте это


#3

Спасибо! Думаю, это то, что надо. Только еще один вопрос: как добавить это в свой проект?


#4

Очень легко)


#5

Еще раз спасибо, очень выручили)


#6

Я делаю 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 в переменные, чтобы дальше ими пользоваться?


#7

По всей видимости вы получаете в ответ json, который находиться в response.data.
Как работать с json можно посмотреть например здесь


#8

Спрошу тут)). Делаю 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 в квадратных скобках. Как быть?


#9

Ну если ПОСТ, то по идее вы параметры в заголовках передаете! Пришлите строку для входа в АПИ, нужные параметры для передачи, я напишу методу и покажу вам. Просто нужно установить заголовки и будет счастье. NSURLSession прекрасносно с этим справляется


#10

Вы параметры неправильно передаете, попробуйте так:

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)
    }
}

#11

Спасибо, так работает. Я так понимаю фишка в этом requestSerializer: JSONParameterSerializer()


#12

По умолчания параметры передаются как query string.


#13

Понял. Спасибо большое.


#14

Это пример на будущее, как штатными средствами можно выполнить 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

#15

Помогите составить запрос для получения данных с сайта producthunt.com.
Необходимо получить товары на сегодня для выбранной категории.
Описание: https://api.producthunt.com/v1/docs