Post запрос на сервер

post
swift
xcode
request
ios

#1

Всем привет, столкнулся с неожиданной проблемой на ровном месте. В своем проекте я использую
URLRequest для отправки пост запросов на сервер и получения данных. У меня есть два работающих сервера которые полностью идентичны друг другу по содержимому, так как один выступает резервной площадкой. Пока я создаю приложение под ios я использую резервный сервер, но теперь пришло время переходить на основной и в функции по отправке пост запросов я вписал основной сервер. И тут передача данных прекратилась. Еще раз повторюсь два сервера абсолютно идентичны, потому что с основным сервером у меня работает андроид приложение. Вот код, как было:

       var request = URLRequest(url: URL(string: "http://**.173.154.**/index.php")!)

И как стало:

       var request = URLRequest(url: URL(string: "http://194-**-102-**.ovz.vps.regruhosting.ru/index.php")!)

Причем ни каких ошибок не выходит, просто данные не передаются. Как я понимаю дело здесь в ином формате записи. Если раньше адрес сервера записывался как ip то теперь указывается доменное имя. Пожалуйста помогите разобраться.


#2

А как вы шлете запрос?


#3
         var request = URLRequest(url: URL(string: "http://***-***-***-***.ovz.vps.regruhosting.ru/index.php")!)
    request.httpMethod = "POST"
    let postString = "reg_id=\(numReg)&prog_vers=\(progVers)&prog_platform=\(progPlatform)&acc=\(acc)&pos_lat=\(myLatstr)&pos_lon=\(myLonstr)"
    request.httpBody = postString.data(using: .utf8)
    let task = URLSession.shared.dataTask(with: request) { data, response, error in
        guard let data = data, error == nil else {                                                
            print("error=\(error)")
            return
        }
        
        if let httpStatus = response as? HTTPURLResponse, 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: .utf8)
        print("responseString = \(responseString)")
    }
    task.resume()

Еще раз повторюсь если забивать адрес резервного сервера то все работает. В то же время на приложении на андроиде которое отправляет такой же пост запрос и получает такой же ответ от сервера я пробовал забивать и резервный сервер и основной оба работают. То есть вариант с тем что что то не так на сервере отпадает


#4

Перечитал ваши сообщения несколько раз. Сумбурно описано. Я бы посмотрел логи запросов на сервере для начала. Чтобы понять приходит что-то или нет.


#5

А какой ответ приходит? Что в консоли?


#6

Логи смотрелись ни какие запросы на сервер не приходили


#7

Спасибо Вам! Я знаком с программированием под ios всего неделю и так уж получилось что времени изучать всё досконально не было, поэтому весь код пишется в лоб. И поэтому я просто не увидел эту самую консоль. А посмотрев в нее после вашего сообщения я все понял. Ошибка была в том что когда я переходил по адресу первого сервера, там он указан как ip адрес и не смотря на то что на нем нет поддержки https, среда разработки не ругалась на это и обмен данными шел нормально. Как только я вписывал второй адрес сервера уже доменным именем, мой запрос на сервер тут же блокировался потому что он так же не поддерживает https. Вот парадокс. В итоге в файл info.plist были добавлены необходимые ключи с указанием моего адреса сервера. И все заработало! Правда неизвестно пропустят ли мое приложение с таким небезопасным решением в магазин приложений AppStore.


#8

одно из моих приложений пропустили. но это не есть хорошая практика


#9

Я тоже так думаю, еще я где то читал что скоро вообще запретят приложениям для iOS соединятся с серверами без https. Так что ssl сертификат все равно получу


#10

Здравствуйте, хочу отправить пост запрос на сервер, оправив параметры, у меня не получается что то, правильно ли вообще составлен запрос

    request.httpMethod = "POST"

    request.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")

    **let** post: String = "smenaMK=\( **self** .smenaMK)&summaP=\( **self** .summaP)&resultDI=\( **self** .resultDI)&prichinaVvod=\( **self** .prichinaVvod)&spisPeres=\( **self** .spisPeres)&rabotaSdana=\( **self** .rabotaSdana)&TimeIos=\( **self** .timeIos())&DataIos=\( **self** .dataIos())&kodZayavki=\( **self** .kodZayavki)&CITI=\( **self** .CITI)"

 

    **let** postData: Data = post.data(using: String.Encoding.ascii, allowLossyConversion: **true** )!

    request.httpBody = postData

#11

покажите лучше скрин этого кода, что бы увидеть истинный код


#13

а где URLSession и оптарвка подготовденного запроса?
у вас не хватает половины кода

Плюс, запрос ваш не выполнится до конца, т.к. у вас стоит возврат на ViewControllerM.

Сравните ваш код и код выше.


#14
@IBAction func ObrabotatVse(_ sender: UIButton) {

        let alertControllerItog = UIAlertController(title: nil, message: "Вы уверены что хотите обработать?", preferredStyle: .alert)
        alertControllerItog.addAction(UIAlertAction(title: "Нет", style: .cancel, handler: nil))
        alertControllerItog.addAction(UIAlertAction(title: "Да", style: .default, handler: { action
            in
            var request = URLRequest(url: URL(string: "http://1**.**.31.**0/iosmaster/reception.php")!)
            
            request.httpMethod = "POST"
        

            let post: String = "smenaMK=\(self.smenaMK)&summaP=\(self.summaP)&resultDI=\(self.resultDI)&prichinaVvod=\(self.prichinaVvod)&spisPeres=\(self.spisPeres)&rabotaSdana=\(self.rabotaSdana)&kodZayavki=\(self.kodZayavki)&CITY=\(self.CITY)"
          
            request.httpBody = post.data(using: .utf8)
            let task = URLSession.shared.dataTask(with: request) { data, response, error in
                guard let data = data, error == nil else {
                    print("error=\(error)")
                    return
                }
            }
                task.resume()
            
//            let destintionVC = self.navigationController!.viewControllers[0] as! ViewController
            let viewControllers: [UIViewController] = self.navigationController!.viewControllers
            for aViewController in viewControllers {
                if(aViewController is ViewControllerM){
                    self.navigationController!.popToViewController(aViewController, animated: true)
                    
                }
            }
            print(post)
        }))
        self.present(alertControllerItog, animated: true, completion: nil)
      
        
    }

вот так сделал, тоже не отправляет, мне не нужно что то получать от сервака в этот момент, просто передать данные


#15

попробуйте закоментировать закрытие VC в конце. запрос вроде верно составлен, должен уходить.


#16

Добавил вот это

let task = URLSession.shared.dataTask(with: request) { data, response, error in
                guard let data = data, error == nil else {
                    print("error=\(error)")
                    return
                }
                let responseString = String(data: data, encoding: .utf8)
                print("responseString = \(responseString)")
            }
                task.resume()

выводит в консоль

responseString = Optional("[{“errorbd”:“Connect error”}]")
этой ошибки нет по этому файлу php,
у меня двай файла php, к первому я подключаюсь в начале и получаю инфу, потом в 2 ой файл я отправлю инфу, а выводит ошибку из первого


#17

значит запрос уходит с девайса, следовательно дальше ищите ошибку на сервере.


#18

а что вот это значит, подчеркивает желтым
( self .resultDI)
String interpolation produces a debug description for an optional value; did you mean to make this explicit?
и предлагает два варианта


#19

вы передаете опциональное значение, укажите дефолтное


#20
**let** post: String = "smenaMK=12345&summaP=2352&resultDI=явяаив&prichinaVvod=ачптачпт&spisPeres=456456&rabotaSdana=1&kodZayavki=167503&CITY=local_test"

вот так вот все заполнилось


#21

как тогда мне туда переменные вставить и отправить