Ios 如何使用Alamofire在get请求中发送JSON正文

Ios 如何使用Alamofire在get请求中发送JSON正文,ios,swift,alamofire,Ios,Swift,Alamofire,从3周以来,我一直面临一个问题,我使用的API非常特殊,它需要一个JSON对象作为GET请求的主体。我认为这是主要的问题 感谢Alamofire文档和堆栈溢出中提供的所有帮助,我尝试使用ParameterEncoding自定义编码,但仍然没有成功 当我使用Postman或终端中的curl发出请求时,没有问题,但当我使用Alamofire使用swift开发时,我得到一个内部错误500或在响应中没有传递任何信息(当我在请求函数中使用关键字encoding:JSONEncoding.default设置

从3周以来,我一直面临一个问题,我使用的API非常特殊,它需要一个JSON对象作为GET请求的主体。我认为这是主要的问题

感谢Alamofire文档和堆栈溢出中提供的所有帮助,我尝试使用ParameterEncoding自定义编码,但仍然没有成功

当我使用Postman或终端中的curl发出请求时,没有问题,但当我使用Alamofire使用swift开发时,我得到一个内部错误500或在响应中没有传递任何信息(当我在请求函数中使用关键字encoding:JSONEncoding.default设置参数时)

下面是curl示例:

curl-xget -H'内容类型:应用程序/json' -d'{“用户”:帐户,“签名”:密码}'

以下是我的代码示例:

/// 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)
}
“JSONSTRINGARLAYENCODE”是一个带有自定义编码的结构:

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


提前感谢您的帮助。

如您所述,您的请求正在使用邮递员或curl-in终端进行处理。下面是我得到的结果

正如@Glenn所指出的,使用url访问浏览器的结果如下所示

我相信,您请求的url有问题

编辑:

请参见下图,了解它使用curl的原因

请将您的请求作为post尝试一次,然后添加
content type=application/x-www-form-urlencoded
,我不确定,但可能会有所帮助

试试这个:

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=“坏令牌”; }


只需替换
JSON.encoding
->
URLEncoding

Alamofire.request(path,method: .get, parameters: params, encoding: URLEncoding.default, headers: nil)

您是否尝试过在浏览器中访问您的url?当然,当我在Swift中开发时,有时也会遇到同样的错误,但是当我使用postman或curl命令进行测试时,没有问题。我应该明确指出,您需要在正文中发送一个对象:{“user”:test@epitech.eu,“签名”:“长令牌”}我仍然得到500个错误:状态代码:500,标题{Connection=(“keep-alive”);“Content-Length=(759);“Content-Type=(“text/html;charset=UTF-8”);Date=(“Fri,2019年4月26日07:23:21 GMT”);Server=(“nginx/1.10.2”);}[Result]:失败:responseSerializationFailed(原因:Alamofire.AFError.responseSerializationFaileureReason.jsonSerializationFailed(错误:错误域=NSCOCAerorDomain代码=3840“字符5周围的无效值”)你不应该像这样暴露你的签名。这可能会导致数据泄露。谢谢,我应该删除我的帖子吗?只删除你的评论,我相信,-d in curl用于发布帖子类型请求中的数据