Search code examples
swiftnsurlsessionnsurlrequest

NSMutableURLRequest.HTTPMethod not setting the correct Method


I have this request to an API which should POST some json:

class func makeAPICall (serializedJSONObject contentMap: Dictionary<String, String>, completion: ((data: NSData?, response: NSURLResponse?, error: NSError?) -> Void)) throws -> Void {
        var jsonData: NSData
        do {
            jsonData = try NSJSONSerialization.dataWithJSONObject(contentMap, options: NSJSONWritingOptions())
            var jsonString = NSString(data: jsonData, encoding: NSUTF8StringEncoding) as! String
            print(jsonString)
            jsonString = jsonString.stringByAddingPercentEncodingForFormUrlencoded()!
            print(jsonString)
            jsonData = jsonString.dataUsingEncoding(NSUTF8StringEncoding)!
            let postsEndpoint: String = "https://www.example.com/api/v2"
            guard let postsURL = NSURL(string: postsEndpoint) else {
                throw APICallError.other("cannot create URL")
            }
            let postsURLRequest = NSMutableURLRequest(URL: postsURL)
            print(jsonData)
            postsURLRequest.HTTPBody = jsonData
            print(postsURLRequest)
            postsURLRequest.HTTPMethod = "POST"

            let config = NSURLSessionConfiguration.defaultSessionConfiguration()
            let session = NSURLSession(configuration: config)

            let task = session.dataTaskWithRequest(postsURLRequest, completionHandler: {
                (data, response, error) in
                completion(data: data, response: response, error: error)
            })
            task.resume() //starts the request. It's called resume() because a session starts in a suspended state
        } catch {
            print("lol, problem")
        }
    }

with extension (for x-www-form-urlencoded encoding):

extension String {
    func stringByAddingPercentEncodingForFormUrlencoded() -> String? {
        let characterSet = NSMutableCharacterSet.alphanumericCharacterSet()
        characterSet.addCharactersInString("-._* ")

        return stringByAddingPercentEncodingWithAllowedCharacters(characterSet)?.stringByReplacingOccurrencesOfString(" ", withString: "+")
    }
}

now I also have this simple test page to test json requests:

<form action="v2/" method="post">
    <textarea name="data" rows="20" cols="80"></textarea>
    <input type="submit" />
</form>

the server logs all requests so that way I found out that my app is actually using GET instead of POST

app request log:

GET /api/v2/ HTTP/1.1

HTTP headers:
Host: www.example.com
Accept: */\*
Cookie: PHPSESSID=vd61qutdll216hbs3a677fgsq4
User-Agent: KM%20registratie%20tabbed%20NL/1 CFNetwork/758.2.8 Darwin/15.2.0
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: keep-alive

Request body:

(notice the request body is also empty, but I'll make a different question for that)

html form request log:

POST /api/v2/ HTTP/1.1

HTTP headers:
Host: www.example.com
Origin: http://www.example.com
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/\*;q=0.8
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/601.3.9 (KHTML, like Gecko) Version/9.0.2 Safari/601.3.9
Referer: http://www.example.com/api/test.php
Accept-Language: en-us
Accept-Encoding: gzip, deflate

Request body:
data=%7B%22action%22%3A+%22vehicleRecords%22%2C%0D%0A%22token%22%3A+%22token_04e01fdc78205f0f6542bd523519e12fd3329ba9%22%2C%0D%0A%22vehicle%22%3A+%22vehicle_e5b79b2e%22%7D

Solution

  • The url should have a trailing forward-slash so: "www.example.com/api/v2/"