Метод отправки запроса iOS Swift Http с использованием заголовка x-www-form-urlencoded?

Мне нужно сделать вызов API с заголовками как значение application/x-www-form-urlencoded в виде строки JSON. Когда в почтальоне указывается значение параметра и заголовок, он отлично работает и возвращает код состояния 200 ok. Здесь я использую бэкэнд node js. Метод Post не работает во внешнем интерфейсе. Не знаю, в чем проблема.

Ошибки:

Sometimes i am getting request time out, 
NSUrlfailingstring, finished with status code 1001

Вот код моего бэкенда:

  var status = {
SUCCESS : 'success',
FAILURE : 'failure'
}

var httpStatus = {
OK : HttpStatus.OK,
ISE : HttpStatus.INTERNAL_SERVER_ERROR,
BR : HttpStatus.BAD_REQUEST
}
exports.likes= function(req, res){

var Username =req.body.username;
var likecount=req.body.count;
var likedby = req.body.likedby;
var postId = req.body.postId;
var tokenId = req.body.tokenId;
var message = {
                     to: tokenId, 
                     collapse_key: '',
                     data: {
                        name:Username,
                        Message:"Content about message",
                        Redirect:"TopostId : "+postId,
                        time: ""
                      },
                     notification: {
                                    title: "Hey Buddy , Someone have liked your post",
                                    body: likedby +"Likedyourpost",
                                    icon: "notification"
                                    }
                };


fcm.send(message)
    .then(function (response) {
        console.log("Successfully sent with response: ", response);
        res.status(httpStatus.OK).json({
        status: status.SUCCESS,
        code: httpStatus.OK,            
        error:''
    });
            return;
            })
        .catch(function (err) {
             console.log(err);

            });

};


module.exports = function(app) {
app.post('/likesnotification', notification.likes);
app.post('/commentsnotification', notification.comments);
app.post('/othernotification', notification.othernot);
app.post('/followrequset', notification.followreq);
app.post('/followresponse', notification.followres);
app.post('/publicaccountfollow', notification.publicacfollow);

};

Вот мой передний код в ios Swift:

Попробуйте 1:

   func postNotification(postItem: String, post: Post) {

print("Get token from post:::",post.token)
print(postItem)
let token = UserDefaults.standard.string(forKey: "token")




let headers: HTTPHeaders = ["Content-Type" :"application/x-www-form-urlencoded"]

   let parameters : [String:Any] = ["count":post.likeCount!, "likedby":currentName, "postId=":postItem, "token": post.token!]
Alamofire.request("http://highavenue.co:9000/likesnotification/", method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: nil).responseJSON { (response:DataResponse<Any>) in

    switch(response.result) {
    case .success(_):
        if let data = response.result.value{
            print(data)
        }
        break

    case .failure(_):
        print(response.result.error as Any)
        break

    }
   }

}

Попробуйте 2:

 var parameters       = [String:Any]()

parameters["count"]  = post.likeCount!
parameters["likedby"]  = currentName
parameters["postId"] = postItem
parameters["token"] = post.token!

  let Url = String(format: "http://highavenue.co:9000/likesnotification")
guard let serviceUrl = URL(string: Url) else { return }
//        let loginParams = String(format: LOGIN_PARAMETERS1, "test", "Hi World")
let parameterDictionary = parameters
var request = URLRequest(url: serviceUrl)
request.httpMethod = "POST"
request.setValue("Application/json", forHTTPHeaderField: "Content-Type")
guard let httpBody = try? JSONSerialization.data(withJSONObject: parameters, options: []) else {
    return
}
request.httpBody = httpBody

let session = URLSession.shared
session.dataTask(with: request) { (data, response, error) in
    if let response = response {
        print(response)
    }
    if let data = data {
        do {
            let json = try JSONSerialization.jsonObject(with: data, options: 
    [])
            print(json)
        }catch {
            print(error)
        }
    }
    }.resume()

Любая помощь очень ценится, пожалуйста.


person PvDev    schedule 11.07.2018    source источник
comment
проверьте на стороне сервера, проверьте, получаете ли вы данные или нет?   -  person Pratik Prajapati    schedule 11.07.2018
comment
@PratikPrajapati я получаю данные в почтальоне   -  person PvDev    schedule 11.07.2018
comment
я имею в виду, получаете ли вы данные при запросе с устройства/симулятора   -  person Pratik Prajapati    schedule 11.07.2018
comment
@PratikPrajapati завершает работу с ошибкой с кодом ошибки: -1001 Необязательный (домен ошибки = код NSURLErrorDomain = -1001 Время ожидания запроса истекло. UserInfo = {NSUnderlyingError = 0x1c0e56920 {Домен ошибки = kCFErrorDomainCFNetwork Code = -1001 (null) -2102, _kCFStreamErrorDomainKey=4}}, NSErrorFailingURLStringKey=highavenue.co:9000/likesnotification, NSErrorFailingURLKey= highavenue.co:9000/likesnotification, _kCFStreamErrorDomainKey=4, _kCFStreamErrorCodeKey=-2102, NSLocalizedDescription=запрос истекло время ожидания.}) на основе ответа Дипен Чудасама   -  person PvDev    schedule 11.07.2018
comment
@PratikPrajapati да, я получаю данные   -  person PvDev    schedule 11.07.2018
comment
возможно, когда вы запрашиваете с устройства iOS, сервер не обнаруживает некоторые значения параметров. сравните данные запроса почтальона и вашего устройства на серверной стороне. надеюсь, ты найдешь что-нибудь   -  person Pratik Prajapati    schedule 11.07.2018
comment
@PratikPrajapati, правильный ли мой интерфейсный код ??   -  person PvDev    schedule 11.07.2018
comment
Давайте продолжим это обсуждение в чате.   -  person Pratik Prajapati    schedule 11.07.2018


Ответы (1)


Я видел ваш код, который вы должны вызывать для параметра заголовка, который вы для него создали. Вы не передаете заголовок в методе запроса alamofire.

Как показано ниже:

let headers: HTTPHeaders = ["Content-Type" :"application/x-www-form-urlencoded"]

   let parameters : [String:Any] = ["count":post.likeCount!, "likedby":currentName, "postId=":postItem, "token": post.token!]
Alamofire.request("http://highavenue.co:9000/likesnotification/", method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: headers).responseJSON { (response:DataResponse<Any>) in

    switch(response.result) {
    case .success(_):
        if let data = response.result.value{
            print(data)
        }
        break

    case .failure(_):
        print(response.result.error as Any)
        break

    }
   }

}
person Dipen Chudasama    schedule 11.07.2018
comment
Получение такой ошибки завершилось с кодом ошибки: -1001 Необязательно (Домен ошибки = Код NSURLErrorDomain = - 1001 Время ожидания запроса истекло. UserInfo = {NSUnderlyingError = 0x1c0e56920 {Домен ошибки = kCFErrorDomainCFNetwork Code = -1001 (null) -2102, _kCFStreamErrorDomainKey=4}}, NSErrorFailingURLStringKey=highavenue.co:9000/likesnotification, NSErrorFailingURLKey= highavenue.co:9000/likesnotification, _kCFStreamErrorDomainKey=4, _kCFStreamErrorCodeKey=-2102, NSLocalizedDescription=запрос время вышло.}) - person PvDev; 11.07.2018
comment
Вы передали эту переменную заголовка в методе alamo fire, как я упоминал выше? - person Dipen Chudasama; 11.07.2018
comment
Эй, ты можешь помочь мне выбраться из этого - person PvDev; 11.07.2018
comment
Здравствуйте, можете посмотреть скриншоты почтальона....drive. google.com/file/d/1dmXvE2PoSnh9Dj0XVfGtMRu-IDKXETps/ - person PvDev; 11.07.2018
comment
Передайте заголовок следующим образом: let headers = [ Content-Type : application/x-www-form-urlencoded ] - person Dipen Chudasama; 11.07.2018