如何处理/解析/读取“multipart / mixed;边界=批次"响应 [英] how to process/parse/read a "multipart/mixed; boundary=batch" response

查看:282
本文介绍了如何处理/解析/读取“multipart / mixed;边界=批次"响应的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何使用JavaScript / jQuery处理/解析/读取类型为multipart / mixed; boundary = batch的响应?

How to process/parse/read a response that is of type "multipart/mixed; boundary=batch" using JavaScript/jQuery?

在我们的应用程序中,我们得到如下响应:

In our application we get a response as given below:

有没有办法处理这些反应?或者我们应该使用正则表达式等原始字符串操作来获取我们想要的内容?

Is there a way to process these kind of responses? Or should we use raw string manipulations using regex, etc to get the content we want?

--batchresponse_e3e3tc10-1181-4b94-bb8a-952452769d53
Content-Type: multipart/mixed; boundary=changesetresponse_4sdflwerf-40ef-4347-8c77-b364e5d2e678

--changesetresponse_4sdflwerf-40ef-4347-8c77-b364e5d2e678
Content-Type: application/http
Content-Transfer-Encoding: binary

HTTP/1.1 201 Created
DataServiceVersion: 1.0;
Content-Type: application/json;odata=verbose;charset=utf-8
Content-ID: 1
X-Content-Type-Options: nosniff
Cache-Control: no-cache
Location: <url1>

{"Some": "JSON response"}
--changesetresponse_4sdflwerf-40ef-4347-8c77-b364e5d2e678
Content-Type: application/http
Content-Transfer-Encoding: binary

HTTP/1.1 204 No Content
Content-ID: 2
X-Content-Type-Options: nosniff
Cache-Control: no-cache
DataServiceVersion: 1.0;


--changesetresponse_4sdflwerf-40ef-4347-8c77-b364e5d2e678
Content-Type: application/http
Content-Transfer-Encoding: binary

HTTP/1.1 204 No Content
Content-ID: 3
X-Content-Type-Options: nosniff
Cache-Control: no-cache
DataServiceVersion: 1.0;


--changesetresponse_4sdflwerf-40ef-4347-8c77-b364e5d2e678--
--batchresponse_e3e3tc10-1181-4b94-bb8a-952452769d53--


推荐答案

不幸的是,似乎没有一个库来处理这个问题。这就是我最终做的事情。以下解决方案假设angular和lodash(_)可用,但它可以适应其他框架。

Unfortunately, there doesn't seem to be a library out there to handle this. Here's what I ended up doing. The following solution assumes angular and lodash ("_") are available, but it could be adapted to other frameworks.

鉴于 responseCollection 是初始帖子中显示的http响应,我们首先从初始标题中找到边界。然后,使用该边界将响应拆分为其组件。在每个组件中,假设第一个实例 {标记JSON的开头,最后一个实例标记为} 结束了。 JSON被反序列化并被推送到响应对象的集合。

Given that responseCollection is the http response shown in the initial post, we first find the boundary from the initial header. Then, use that boundary to split the response into its components. In each component, it is assumed that the first instance of "{" marks the beginning of JSON, and the last instance of "}" is the end. The JSON is deserialized and pushed onto the collection of response objects.

这显然不适用于每个场景并做出一些广泛的假设,但它足以解决我的问题问题。

This obviously won't work for every scenario and makes some broad assumptions, but it was enough to solve my problem.

    function parseBatch(responseCollection) {
        var items = [];

        var boundary = getBatchSeparator(responseCollection);

        var responseLines = responseCollection.data.split('--' + boundary);

        _.forEach(responseLines, function (response) {
            var startJson = response.indexOf('{');
            var endJson = response.lastIndexOf('}');

            if (startJson < 0 || endJson < 0) {
                return;
            }

            var responseJson = response.substr(startJson, (endJson - startJson) + 1);

            var item = angular.fromJson(responseJson);

            items.push(item);
        });

        return items;
    }

    function getBatchSeparator(response) {
        var headers = response.headers();

        if (!headers['content-type'])
            return ''; //would probably be bad if this happens, but not sure it ever will.

        var components = headers['content-type'].split(';');

        var boundary = _.find(components, function (o) { return _.startsWith(_.trim(o), 'boundary=') });

        boundary = _.replace(boundary, 'boundary=', '');

        boundary = _.trim(boundary, '; ');

        return boundary;
    }

这篇关于如何处理/解析/读取“multipart / mixed;边界=批次&QUOT;响应的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆