Search code examples
iosangularjsjsonnsurlrequest

How can I get data out of NSURLRequest config object


I have an Angular web build inside an iOS app and want to POST requests up to the native layer with some JSON that I can use to build some native functionality. I am using the old UIWebView (because Angular) so am using an NSURLProtocol to intercept the request. This works and I can break at the point that the request comes in. The problem is that I can not see the JSON in the data property at this point because it is not the response. The request is still in the config object but I have no idea how to grab this.

My angular code for creating the post is currently like this:

var newdata = $.param({
            json: JSON.stringify({
                name: "Lee"
            })
        });

        $http.post(url, newdata)

and in my NSURLProtocol class I am successfully intercepting this POST in this method but the HTTPBody property is nil:

override class func canInitWithRequest(request:NSURLRequest) -> Bool {

        if (request.URL!.absoluteString as NSString).containsString("request_media_gallery") {

            if(request.HTTPBody != nil){

                let data:NSData = request.HTTPBody!
                print(data)
            }
            return true
        }
        return request.URL?.host == "file"
    }

If I debug this in chrome I get a 405 because of CORS but I can see that my request object does not have any data but does have a config object. Here's the console log from Chrome:

console log


Solution

  • By the time a URL request gets down to the protocol layer, IIRC, the URL Loading System sanitizes it in a lot of ways. In particular, if a request has an HTTPBody object associated with it, it basically does this:

    req.HTTPBodyStream = [NSInputStream inputStreamWithData:req.HTTPBody];
    req.HTTPBody = nil;
    

    As a result, to get the data, you need to read from the HTTPBodyStream, regardless of whether the request was originally created with an NSData object or a body stream.