gpt4 book ai didi

javascript - 使用 XMLHTTPRequest 的 OData 批处理请求

转载 作者:行者123 更新时间:2023-11-29 18:16:53 30 4
gpt4 key购买 nike

我正在尝试编写一个 javascript OData 消费者,它将一次获取我的几个实体以进行 POST(这样我就可以一次提交一个实体和关联的子实体)到我的 WebApi 服务器。但是我收到一个烦人的错误:

ExceptionMessage: "The message header 'POST /odata/MyEntity HTTP/1.1' is invalid. The header value must be of the format '<header name>: <header value>'."
ExceptionType: "Microsoft.Data.OData.ODataException"
Message: "An error has occurred."
StackTrace: " at Microsoft.Data.OData.ODataBatchReaderStream.ValidateHeaderLine(String headerLine, String& headerName, String& headerValue)
↵ at Microsoft.Data.OData.ODataBatchReaderStream.ReadHeaders()
↵ at Microsoft.Data.OData.ODataBatchReaderStream.ProcessPartHeader()
↵ at Microsoft.Data.OData.ODataBatchReader.SkipToNextPartAndReadHeaders()
↵ at Microsoft.Data.OData.ODataBatchReader.ReadImplementation()
↵ at Microsoft.Data.OData.ODataBatchReader.ReadSynchronously()
↵ at Microsoft.Data.OData.ODataBatchReader.InterceptException[T](Func`1 action)
↵ at Microsoft.Data.OData.ODataBatchReader.Read()
↵ at System.Web.Http.OData.Batch.DefaultODataBatchHandler.<ParseBatchRequestsAsync>d__e.MoveNext()
↵--- End of stack trace from previous location where exception was thrown ---
↵ at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
↵ at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
↵ at System.Web.Http.OData.Batch.DefaultODataBatchHandler.<ProcessBatchAsync>d__0.MoveNext()
↵--- End of stack trace from previous location where exception was thrown ---
↵ at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
↵ at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
↵ at System.Web.Http.Batch.HttpBatchHandler.<SendAsync>d__0.MoveNext()"

我构建它的函数如下:

var oReq = new XMLHttpRequest();
oReq.onload = function () {
if (oReq.status == 404) {
defer.reject(oReq.statusText);
} else {
var response = JSON.parse(oReq.response);
if (response['odata.error']) {
defer.reject(oReq['odata.error']);
} else if (response.Message) {
defer.reject(response.Message);
} else {
defer.resolve(response);
}
}
};
oReq.onerror = function () {
defer.reject(oReq.statusText);
};
oReq.open("POST", "/odata/$batch", true);
var batch = "batch_" + newGuid();
oReq.setRequestHeader("Content-type", 'multipart/mixed; boundary="' + batch + '"');

var body = "--" + batch + "\r\n";
ko.utils.arrayForEach(entities, function (entity) {
body = body + [
'Content-Type: application/http; msgtype=request',
'',
'POST ' + url + ' HTTP/1.1',
'Content-Type: application/json; charset=utf-8',
'',
ko.toJSON(entity),
"--" + batch
].join('\r\n')
});

oReq.send(body + "--");

我没有正确格式化请求吗?我一直在尝试模仿这个:

http://blogs.msdn.com/b/webdev/archive/2013/11/01/introducing-batch-support-in-web-api-and-web-api-odata.aspx

谢谢。

最佳答案

我有点让这个工作了。我通读了别人的代码 ( https://github.com/volpav/batchjs ) 并进行了自己的实现(因为我不想使用 JQuery)。

export interface ODataChangeRequest {
requestUri: string;
method: string;
data: string;
resolve: (response?: Object) => void;
reject: (response?: Object) => void;
}


export function packBatch(requests: ODataChangeRequest[], boundary: string): string {
var body = [];

body.push('--' + boundary);
var changeSet = 'changeset_' + newGuid();
body.push('Content-type: multipart/mixed; boundary=' + changeSet, '');

ko.utils.arrayForEach(requests, (d) => {
var t = d.method.toUpperCase();

body.push('--' + changeSet);
body.push('Content-Type: application/http', 'Content-Transfer-Encoding: binary', '');

body.push(t + ' ' + d.requestUri + ' ' + httpVersion);
body.push('Host: ' + location.host);

if (d.data) {
body.push('Content-Type: application/json; charset=utf-8');
body.push('', d.data, '');
}
});

body.push('--' + changeSet + '--', '');

body.push('--' + boundary + '--', '');

return body.join('\r\n');
}

export function unpackBatch(requests: ODataChangeRequest[], xhr: XMLHttpRequest): boolean {
var lines = xhr.responseText.split('\r\n'),
i = 0,
data = [],
feedingData = false,
statusCode = null,
allSuccessful = true;

ko.utils.arrayForEach(lines, (l) => {
if (!l.length) {
return;
}

var currentRequest = requests[i];
if (!currentRequest) {
return;
}

var httpIndex = l.indexOf(httpVersion);
if (httpIndex != -1) {
// Hadn't gotten data for previous request. Close
if (statusCode) {
if (statusCode == '200') {
currentRequest.resolve();
} else {
currentRequest.reject();
}
}

var startIndex = httpIndex + httpVersion.length + 1;
statusCode = l.substring(startIndex, startIndex + 3);
if (statusCode != '200') {
allSuccessful = false;
}
}

if (statusCode) {
if (l == "{") {
feedingData = true;
}
if (feedingData) {
data.push(l);
if (l == "}") {
var dataObj = data.length ? JSON.parse(data.join(" ")) : null;
if (statusCode == '200') {
currentRequest.resolve(dataObj);
} else {
currentRequest.reject(dataObj);
}

i++;
data = [];
feedingData = false;
statusCode = null;
}
}
}
});

return allSuccessful;
}

关于javascript - 使用 XMLHTTPRequest 的 OData 批处理请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22456383/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com