Ainsley
Ainsley

Reputation: 33

Swift Alamofire HTTP Get Request

Request code:

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)")
            }
        }
    }

Source: Github ReadMe for Alamofire

I'm having trouble. The request should use data: contentperson son as the request body but it doesn't seem to be. I am NOT returning a JSON object. The connection is 100% made with the server but it doesn't seem to understand my request. A python program to send this request DOES return information.

Request returns:

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.

It is connecting to a Django server with request function:

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))

Upvotes: 2

Views: 1492

Answers (2)

Oshitha Wimalasuriya
Oshitha Wimalasuriya

Reputation: 451

Try this ...

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

                    case .failure(_):

                    break
                    }
}

Upvotes: 0

Yuma Technical Inc.
Yuma Technical Inc.

Reputation: 723

I don't use Alamofire, but I assume the swift script is working fine. To be certain test with a direct request, something like:

    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()
    }

Like Lame said a GET request is simply a URL including a query (?...). A POST request is used when there is a HttpBody. A common use is to send sensitive information -such as a password, usually parameters are sent like the with a GET query (eg. x=23&y=45&z=elephant...)

So I guess there's an issue with the DJANGO logic. Also I am not familiar, but request.body seems to be wrong for a GET request. (Test for its absence in a POST request would be correct, though). I guess you want to parse the query...

Upvotes: 1

Related Questions