Swift Alamofire HTTP 获取请求

Posted

技术标签:

【中文标题】Swift Alamofire HTTP 获取请求【英文标题】:Swift Alamofire HTTP Get Request 【发布时间】:2018-07-18 16:32:40 【问题描述】:

请求代码:

static func testRequest() 
        Alamofire.request(Constants.baseURL,
                          method: .get,
                          parameters: ["data": "contentperson son"]).response  response in
            print("Request: \(response.request)")
            print("Response: \(response.response)")
            print("Error: \(response.error)")

            if let data = response.data, let utf8Text = String(data: data, encoding: .utf8) 
                print("Data: \(utf8Text)")
            
        
    

来源:Github ReadMe for Alamofire

我遇到了麻烦。该请求应使用data: contentperson son 作为请求正文,但似乎并非如此。我没有返回 JSON 对象。连接是 100% 与服务器建立的,但它似乎不理解我的请求。发送此请求的 python 程序确实返回信息。

请求返回:

Request: Optional(URL?data=contentperson%20son)
Response: Optional(<NSHTTPURLResponse: 0x600000833dc0>  URL: URL?data=contentperson%20son   Status Code: 200, Headers 
    Connection =     (
        "keep-alive"
    );
    "Content-Encoding" =     (
        gzip
    );
    "Content-Type" =     (
        "text/html; charset=utf-8"
    );
    Date =     (
        "Wed, 18 Jul 2018 16:58:48 GMT"
    );
    Server =     (
        "nginx/1.10.3 (Ubuntu)"
    );
    "Transfer-Encoding" =     (
        Identity
    );
    "X-Frame-Options" =     (
        SAMEORIGIN
    );
 )
Error: nil
Data: The request data is empty.

它正在使用请求功能连接到 Django 服务器:

def Hello(request):
if(request.method == "GET"):
    data = request.body
    decoded_data = data.decode("utf-8")
    if(decoded_data == ''):
        return HttpResponse("The request data is empty.")
    decoded_data = decoded_data.split(" ")
    #decoded_data[0] is the model type (contentmedia, contenttext, contentperson, contentsite), decoded_data[1] is keyword
    try:
        connected_database = sqlite3.connect('db.sqlite3')
        c = connected_database.cursor()
        c.execute("select * from dataentry_" + decoded_data[0] + " where title like ('%" + decoded_data[1] + "%')")
        connected_database.commit()
        results = c.fetchall()
    except:
        return HttpResponse("Error in reading the database.")
    return HttpResponse(str(results))

【问题讨论】:

什么是响应和错误日志打印? 我不知道 Django,但通常在 GET 请求中,您不会将值放入 myURLrequest.httpBody,但它们在 URL(查询)中。 事实证明,我最大的问题是我的同事没有通过 JSON 或类似的方式发送数据。我和她一起工作,并在我的项目工作结束之前提出了一个基本的解决方案。 【参考方案1】:

我不使用 Alamofire,但我认为 swift 脚本运行良好。为了确定直接请求的测试,例如:

    let url = "http://...?..."
    if let myUrl = URL(string: url)
    
        URLSession.shared.dataTask(with: myUrl)
        
            (data, response, err) in

            if let data = data
            
                let dataString = String(data: data, encoding: .utf8)
                ...
            
        .resume()
    

就像 Lame 所说的,GET 请求只是一个包含查询 (?...) 的 URL。 当有 HttpBody 时使用 POST 请求。一个常见的用途是发送敏感信息——例如密码,通常像 GET 查询一样发送参数(例如 x=23&y=45&z=elephant...)

所以我猜 DJANGO 的逻辑有问题。我也不熟悉,但request.body 对于 GET 请求似乎是错误的。 (不过,在 POST 请求中测试它是否存在是正确的)。我猜你想解析查询...

【讨论】:

【参考方案2】:
Try this ...

Alamofire.request(url)
                .responseJSON  (response:DataResponse<Any>) in
    switch(response.result) 
                    case .success(_):
                    break

                    case .failure(_):

                    break
                    

【讨论】:

以上是关于Swift Alamofire HTTP 获取请求的主要内容,如果未能解决你的问题,请参考以下文章

使用 alamofire 和 Swift4 IOS 获取 XML HTTP url 的响应

在 swift 中使用 Alamofire 的 Json 请求失败

获取新 Alamofire Swift 3 的请求

swift 3 alamofire - 获取请求给出响应序列化失败

Alamofire 无法使用 php 获取请求

Swift 中的 Alamofire HTTP 发布请求