【问题标题】:How can I get data out of NSURLRequest config object如何从 NSURLRequest 配置对象中获取数据
【发布时间】:2016-03-17 13:26:03
【问题描述】:

我在 iOS 应用程序中有一个 Angular Web 构建,并希望通过一些 JSON 向本机层发出 POST 请求,我可以使用这些 JSON 来构建一些本机功能。我正在使用旧的 UIWebView(因为 Angular)所以我使用 NSURLProtocol 来拦截请求。这有效,我可以在请求进入时中断。问题是我此时在数据属性中看不到JSON,因为它不是响应。该请求仍在配置对象中,但我不知道如何获取它。

我创建帖子的角度代码目前是这样的:

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

        $http.post(url, newdata)

在我的NSURLProtocol 类中,我成功地在这个方法中拦截了这个 POST,但 HTTPBody 属性为零:

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

如果我在 chrome 中调试它,我会因为 CORS 而得到 405,但我可以看到我的请求对象没有任何数据,但确实有一个配置对象。这是来自 Chrome 的控制台日志:

【问题讨论】:

    标签: ios angularjs json nsurlrequest


    【解决方案1】:

    当 URL 请求到达协议层 IIRC 时,URL 加载系统会以多种方式对其进行清理。特别是,如果一个请求有一个与之关联的HTTPBody 对象,它基本上会这样做:

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

    因此,要获取数据,您需要从HTTPBodyStream 读取,无论请求最初是使用NSData 对象还是主体流创建的。

    【讨论】:

    • 那么我们如何读取这个 NSInputStream 呢?我的似乎说“没有可用的字节”
    • 令人讨厌的是,字节实际上直到运行循环的稍后周期才变得可用。处理阅读: 1. 将自己设置为流的代表。 2. 将其安排在一个运行循环中。 3. 打开流。 4. 实现字节可用的委托方法。 5. 在它说有可用字节后做你的工作。
    猜你喜欢
    • 1970-01-01
    • 2010-09-26
    • 2023-04-09
    • 2015-04-24
    • 1970-01-01
    • 2013-08-21
    • 2011-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多