gpt4 book ai didi

javascript - 如何从拦截器的响应中返回 SOAP 响应

转载 作者:行者123 更新时间:2023-11-28 00:53:19 25 4
gpt4 key购买 nike

我正在为 AngularJS 创建一个 SOAP 请求拦截器

它看起来像这样:

angular.module('myApp')

.factory('SoapInterceptor', ['$q', function ($q) {


var soapRequest = function (url, SOAPAction, requestEnvelope, callback) {
$.soap({
url: url,
appendMethodToURL: false,
SOAPAction: SOAPAction,
enableLogging: false,
data: requestEnvelope,
success: function (SOAPResponse) { callback(SOAPResponse.toJSON()); },
error: function (SOAPResponse) { throw new Error(SOAPResponse); }
});
}

return {
'request': function (config) {
if (config.data && config.data.isSoap) {
var deferred = $q.defer();
soapRequest(config.url, config.data.soapaction, config.data.requestEnvelope, function (data) {
angular.extend(data, config);
deferred.resolve(data);
});
return deferred.promise;
}
return config;
},
'response': function (response) {
// I somehow want this returned response to be my soap response
// which i have got in request but of course it's no use there
return response;
}
}
}]);

所以我可以在数据存储的方法中使用它,如下所示:

var deferred = $q.defer();

$http.post("http://myapi.com/service.asmx",
{
isSoap: true,
requestEnvelope: reqXml,
soapaction: "http://myapi.com/CampaignsGetList"
})
.success(function (data) {
deferred.resolve(data);
});

return deferred.promise;

当 isSoap 为 true 时,请求正确地将其传递给我的 soapRequest 但我如何传递我得到的响应以由响应函数返回,以便我的消费者可以愉快地使用 promise ?

感谢任何帮助。

最佳答案

如果我理解正确的话,您想要做的是当请求内容的数据设置了标志 isSoap 时覆盖 $http 服务的行为为true。查看您的代码,您似乎实际上想通过使用拦截器自己处理 $http 调用。

问题是拦截器不应该这样使用,拦截器应该做的是在 http 请求 发生之前和/或之后处理事情,但它们不应该处理http 请求 本身。

但是,我认为您想要的是这样的:

定义您自己的“HttpSoap 服务”,如下所示:

app.service('HttpSoap', ['$q', function ($q) {        
return function (url, SOAPAction, requestEnvelope) {
var deferred = $q.defer();
$.soap({
url: url,
appendMethodToURL: false,
SOAPAction: SOAPAction,
enableLogging: false,
data: requestEnvelope,
success: function (SOAPResponse) { deferred.resolve(SOAPResponse.toJSON()); },
error: function (SOAPResponse) { deferred.reject(SOAPResponse) }
});
return deferred.promise;
}
}]);

并像这样使用它:

app.controller('myController', function ($scope, HttpSoap) {
// other code here where I assume that you will define
// the reqXml variable
HttpSoap("http://proxy-send.concep.com/service.asmx", "http://new.cl.truelogic.com.au/CampaignsGetList", reqXml)
.then(function (jsonData) {
//things went well
}, function (errorResponse) {
//something bad happened
});
});

我想指出的其他一些事情:

  1. 您在问题的第二个代码中所做的事情是 "deferred anti-pattern"这是一种非常常见的不良做法,往往发生在刚开始熟悉 Promise 的人中。当我开始使用 Angular 时,我总是陷入这种困境。

  2. 请注意,我删除了 factory 函数中的 callback 参数,因为使用 callback 是个坏主意在 Angular 中,最好使用 $q Promise 来代替。

关于javascript - 如何从拦截器的响应中返回 SOAP 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26515156/

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