Как отправить json в HTTP-запросе с помощью alamofire

Я все еще изучаю программирование на Swift, я успешно использовал сервисы с Alamofire, но теперь столкнулся со следующей проблемой: у меня есть сервис, в котором я отправил 2 json в URL-адресе, и я действительно понятия не имею, как отправить эти данные, я видел несколько примеров, но до сих пор не могу понять. Уже настроил политику безопасности, но проблема та же

Это мой URL {{url}}apps/Search2/{"search":"","user":14,"category":2,"numero":0,"subgroup":-1," типо":-1,"подкатегория":-1,"кантидад":0}/{"максимум":5000,"минимум":1}

и это то, что я пытался

static func loadMenuWithFilter(search : String, userId : Int, categoryId : Int ){
        let menu : Parameters  = ["search" : search, "user" : userId, "category" : categoryId, "numero" : 0, "subgroup" : -1, "tipo" : -1, "subcategory" : -1,"cantidad" : 0]
        Alamofire.request(AlamofireConstants.MENU_FILTER, method: .get, parameters: menu, encoding: JSONEncoding.default)
        .validate(statusCode: 200..<300).responseData { response in
            switch response.result {
            case .failure(let error):
                print("error ==> \(error)")
            case .success(let data):
                do{
                    let decoder = JSONDecoder()
                    decoder.keyDecodingStrategy = .convertFromSnakeCase
                    let result = try decoder.decode(Menu.self, from: data)
                    print("MenuController \(result)")

                } catch {
                    print("MenuController \(error)")
                }
            }
        }
    }

очевидно, у меня не было успеха, потому что я уверен, что это неправильный способ сделать это. Мой ответ службы 404


person dbenitobaldeon    schedule 10.06.2019    source источник
comment
Какую ошибку вы получаете?   -  person onnoweb    schedule 10.06.2019
comment
Это кажется нормальным, но это действительно зависит от того, какую ошибку вы получаете. Потому что это может быть несколько вещей: неверный URL-адрес, неверный метод (пост?), неправильный ключ параметров, сервер недоступен и т. д.   -  person Lirik    schedule 10.06.2019
comment
@onnoweb Я только что обновил свой вопрос с ошибкой   -  person dbenitobaldeon    schedule 10.06.2019
comment
@Lirik Я только что обновил свой вопрос с ошибкой   -  person dbenitobaldeon    schedule 10.06.2019
comment
и кстати, почему вы добавляете целый json в URL? Кажется... странным. Это часто встречается в запросах GET, когда вы добавляете один или два параметра в URL-адрес, но если вы хотите отправить весь объект json, вы добавляете его в тело запроса.   -  person NSNoob    schedule 10.06.2019
comment
Однозначно дубликат. ОП: Вам нужно использовать https и прочитать о App Transport Security. Быстрый поиск самой ошибки показывает множество сообщений и ресурсов, которые помогут вам решить проблему. И хороший способ научиться искать ошибки (искать само сообщение, а не всю копипасту)   -  person Claus Jørgensen    schedule 10.06.2019
comment
хорошо, что веб-сервис работает именно так @NSNoob   -  person dbenitobaldeon    schedule 10.06.2019
comment
@NSNoob Включение тела в запрос GET не поддерживается.   -  person onnoweb    schedule 10.06.2019
comment
какая часть плохо читается, что я все еще учусь быстро, ваши комментарии только уменьшают влияние моей публикации. В любом случае, спасибо за предоставление информации, которая будет полезна для меня, но вы должны хорошо читать и учитывать то, что мы все еще узнаем, и именно поэтому существует такая страница, как этот партнер. @Клаус Йоргенсен   -  person dbenitobaldeon    schedule 10.06.2019
comment
@onnoweb, так как мне отправить кожаный json с помощью alamofire? Я думаю, что это решит проблему с этим.   -  person dbenitobaldeon    schedule 10.06.2019
comment
Обучение @dbenitobaldeon не является оправданием для того, чтобы не выполнять поиск перед тем, как задать вопрос. Вы можете буквально вставить свою ошибку в Google и получить точный ответ на свою проблему. Вы не приложили абсолютно никаких усилий, чтобы решить эту проблему самостоятельно, прежде чем спросить.   -  person Claus Jørgensen    schedule 10.06.2019
comment
Как я уже сказал вам, прочитайте публикацию лучше, пожалуйста, я упоминаю, что я видел много примеров, среди которых ссылка, которую вы мне передали, включена, но я ищу, чтобы кто-то объяснил мне, потому что он дает эту ошибку или как делать это правильно, потому что с примерами не очень понятно. Партнер, вы должны внимательно читать, чтобы избежать этих неудобств и негативных комментариев. @Клаус Йоргенсен   -  person dbenitobaldeon    schedule 10.06.2019
comment
@onnoweb Я думал, что POST будет очевиден. Комментарий не позволил бы мне редактировать его сейчас.   -  person NSNoob    schedule 10.06.2019
comment
@OP: если вы должны добавить его в URL-адрес, преобразовать его в строку, а затем добавить к URL-адресу. В противном случае сделайте запрос POST и используйте ObjectMapper или что-то еще, что вы предпочитаете, чтобы создать свой json и добавить его в тело.   -  person NSNoob    schedule 10.06.2019
comment
@onnoweb Определенно можно отправить параметры запроса в URL-адресе. Alamofire позаботится об этом, когда вы отправляете параметры в виде хеша, что он и сделал. Таким образом, здесь можно использовать GET.   -  person Lirik    schedule 10.06.2019
comment
Проблема здесь как было сказано выше - App Transport Security policy. Вы пытаетесь получить доступ к URL-адресу HTTP, а не HTTPS, и это не разрешено, если вы не укажете это в info.plist. @dbenitobaldeon   -  person Lirik    schedule 10.06.2019
comment
@Lirik Действительно. Я говорил об отправке тела в запросе GET. Это не поддерживается.   -  person onnoweb    schedule 11.06.2019
comment
@Lirik Я больше не получаю ту же ошибку, но теперь получаю 404   -  person dbenitobaldeon    schedule 11.06.2019
comment
@dbenitobaldeon 404 обычно означает, что URL-адрес, к которому вы пытаетесь получить доступ, не найден. Хорошим тестом будет размещение URL-адреса в браузере (добавьте параметры запроса самостоятельно) и посмотрите, что произойдет.   -  person Lirik    schedule 11.06.2019
comment
шляпа странная вещь, потому что из сети и POSTMAN все работает нормально! мне кажется, что данные json не являются телом, если они не должны идти по тому же URL @Lirik   -  person dbenitobaldeon    schedule 11.06.2019
comment
@dbenitobaldeon Если это работает в Интернете, нет причин, по которым оно не будет работать на iOS. проверьте параметры, которые вы отправляете, одинаковы. Проверьте заголовки запроса (тип контента и т. д.). Также исправьте URL-адрес в вопросе. Он должен быть следующим: {{url}}/apps/Search2?search=something&user=14&category=2&numero=0&subgroup=-1&tipo=-1&subcategory= -1&cantidad=0&max=5000&minimo=1 (кстати, почему поисковый запрос пуст? это тоже может быть проблемой)   -  person Lirik    schedule 11.06.2019


Ответы (2)


После поиска нескольких сообщений я нашел решение своей проблемы, поскольку я упомянул, что мне нужно было отправить json в моей цепочке URL-адресов, следует отметить, что они не были параметрами, даже до сих пор я не понимаю, почему мой вопрос был помечен как дубликат. Но решение состояло в том, чтобы преобразовать мое переменное меню, которое имело тип Parameter, преобразовать его в строку, а затем просто объединить его с URL-адресом. С этим действием сервис был успешно выполнен, не нужно было выполнять ни все настройки, которые я указал в комментариях, ни настройку в App Transport Security и не передавать мое вариабельное меню как Encoding.default. Ничего из этого не сработало.

Это было сделано просто

ConvertJson.jsonToString(json: menu as AnyObject)


class func jsonToString(json: AnyObject) -> String{
        var item : String!
        do {
            let data1 =  try JSONSerialization.data(withJSONObject: json, options: JSONSerialization.WritingOptions.prettyPrinted) // first of all convert json to the data
            let convertedString = String(data: data1, encoding: String.Encoding.utf8) // the data will be converted to the string
            item = convertedString!
        } catch let myJSONError {
            print(myJSONError)
        }
        return item
    }

Я получил код примера по этой ссылке где у них похожая проблема

person dbenitobaldeon    schedule 12.06.2019

Попробуйте изменить JSONEncoding.default на URLEncoding.default?

person Ly Boung    schedule 10.06.2019