Как отправить тело JSON в запросе get с Alamofire - PullRequest
1 голос
/ 26 апреля 2019

Я столкнулся с проблемой уже 3 недели, я использую довольно специфический API, которому нужен объект JSON в качестве тела в GET-запросе.И я думаю, что это главная проблема

Я пытался настроить свое кодирование с помощью ParameterEncoding благодаря документации Alamofire и всей помощи, предоставленной в переполнении стека, и все еще безуспешно.

Когда я делаю свой запросс почтальоном или с curl в моем терминале проблем нет, но когда я развиваюсь в swift с Alamofire, я получаю внутреннюю ошибку 500 или ничего не передается в моем ответе (когда я устанавливаю свой параметр в моей функции запроса с помощью ключевого слова encoding: JSONEncoding.default).

Вот пример curl:

curl -X GET https://blih.epitech.eu/user/repositories -H 'Content-Type: application / json' -d '{"user": account, "signature": password} '

Вот пример моего кода:

/// swift 5
let userString = #"{"user":"\#(account)","signature":"\#(signaturePassword)"}"#
let urlString = "https://blih.epitech.eu/repositories"

Alamofire.request(urlString, method: .get, parameters: [:], encoding: JSONStringArrayEncoding.init(string: userString), headers: nil)
    .responseJSON { (response) in
        debugPrint(response)
}

JSONStringArrayEncoding - это структура с моей пользовательской кодировкой:

struct JSONStringArrayEncoding: ParameterEncoding {
    private let myString: String

    init(string: String) {
        self.myString = string
    }

    func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest {
        var urlRequest = try urlRequest.asURLRequest()

        let data = Data(myString.utf8)

        if urlRequest.value(forHTTPHeaderField: "Content-Type") == nil {
            urlRequest.setValue("application/json", forHTTPHeaderField: "Content-Type")
        }

        urlRequest.httpBody = data

        return urlRequest
    }
}

Я ожидаю получить массив json, когда запрос будет успешным:

{
"message": "Listing successful",
    "repositories": {
        "aaaa": {
            "uuid": "e3a6bea1-c581-5fde-a3a8",
            "url": "https://blih.epitech.eu/repository/aaa"
        }
    }
}

Но я получаю внутреннюю ошибку 500.

Заранее благодарю за помощь.

Ответы [ 2 ]

1 голос
/ 26 апреля 2019

Как вы уже упоминали, ваш запрос работает с использованием почтальона или curl в терминале. Ниже приведен результат, который я получаю

enter image description here

Как указал @Glenn, результат посещения браузера с URL blih.epitech.eu / user / repositories показывает результат, подобный приведенному ниже

enter image description here

Я полагаю, что с URL, который вы запрашиваете, что-то не так.

РЕДАКТИРОВАНИЕ:

См. Изображение ниже, чтобы понять, почему оно работает с curl

enter image description here

Попробуйте один раз опубликовать запрос и добавьте content-type = application/x-www-form-urlencoded Я не уверен, но это может помочь.

0 голосов
/ 26 апреля 2019

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

let url = "https://blih.epitech.eu/user/repositories"
let param = ["user":"asdfdsf",
    "signature":"password"]
if let jsonData = try? JSONEncoder().encode(param) {

    var request = URLRequest(url: URL(string: url)!)
    request.httpMethod = HTTPMethod.post.rawValue
    request.setValue("application/json; charset=UTF-8", forHTTPHeaderField: "Content-Type")
    request.httpBody = jsonData

    Alamofire.request(request).responseJSON {
        (response) in
        debugPrint(response)
    }
}

ВЫХОД:

{error = "Bad token";}

...