简单地分解 - 在我的Web应用程序端,我将一些数据发布到运行HttpListener的C#应用程序,该请求被监听器捕获,然后一些操作完成,最后将响应发送回Web应用程序响应原始帖子。
这是监听器捕获请求后使用的回调方法
private void ListenerCallback(IAsyncResult listenerresult)
{
var context = listener.EndGetContext(listenerresult);
Thread.Sleep(1000);
var data_text = new StreamReader(context.Request.InputStream,
context.Request.ContentEncoding).ReadToEnd();
//Do some work and create the 'responseArray' that is sent back containing some message
var response = context.Response;
response.ContentLength64 = responseArray.Length;
response.Headers.Add("Access-Control-Allow-Origin", "*");
response.Headers.Add("Access-Control-Allow-Methods", "POST, GET");
response.StatusCode = 200;
response.StatusDescription = "OK";
response.OutputStream.Write(responseArray, 0, responseArray.Length);
response.OutputStream.Close();
}
当我使用jQuery Ajax Post到达Listener并向它发送一些数据时,它工作得很漂亮,并且变量data_text
填充了我发送的内容。这是我使用的Ajax Post:
jQuery.ajax({
type: "POST",
url: 'http://127.0.0.1:8089/',
data: '{"Variable 1":"Value 1", "Variable 2":"Value 2"}',
crossDomain: true,
success: function (data) {
// Use data here
}
}).fail(function (jqXHR, textStatus, errorThrown) {
alert('Alert user that something went wrong');
});
我现在必须将我的实现移到angular,这就是问题所在。当使用Angular的$ http.post时,Listner确实捕获了请求但是data_text变量总是为空,即从中读取的数据请求的数据流为空。这是我使用的$ http.post - 注意:在使用Angular的帖子时,我使用包装$ http.post的服务来节省时间:
httpService.post('http://127.0.0.1:8089/', data).then(function (result) {
alert(result.msg);
});
以下是用于执行上述帖子的服务:
app.service('httpService', function($http, $q) {
this.post = function (url, data) {
try {
return $http.post(url, data || {}, { timeout: 1000 * 20 }).then(function (response) {
if (response.data.success) {
return response.data.obj;
} else {
return ($q.reject(response.data.msg));
}
}, function (error) {
if (error.status === 0) {
return ($q.reject('408' + ' : The server timed out waiting for the request, please try again'));
}
return ($q.reject(error.status + ' : ' + error.statusText));
});
} catch (e) {
alert(e.message);
return $q.reject(e.message);
}
}
});
据我所知,Angular是在jQuery版本的基础上构建的,当你到达最低级别(vanilla JS)时,jQuery Ajax Post与$ http.post做同样的事情。我错过了什么?
更新:正如Mike Feltman指出的那样,我可以对我的数据使用$ httpParamSerializerJQLike,并在标题中指定内容类型:
return $http.post(url, $httpParamSerializerJQLike(data), { headers: { 'Content-type': 'application/x-www-form-urlencoded'}})
这有效,我接收数据,但是我不能使用的格式,我需要JSON格式的数据,所以我读了一下并将内容类型从application/x-www-form-urlencoded
更改为{{1但是,我再次没有收到任何数据。
答案 0 :(得分:1)
您可能在Angular发送帖子数据与Jquery的方式上存在差异。要解决此问题,您必须将$ httpParamSerializerJQLike注入您的服务,然后指定在您调用http.post时使用它,方法是将数据发送到调用它:$ httpParamSerializerJQLike(myData)。
这是关于它的角度文档: https://docs.angularjs.org/api/ng/service/ $ httpParamSerializerJQLike
我有一个我目前无法达到的工作样本,但如果这不足以让你继续下去,可以稍后再挖掘它。
我的服务中有一些问题让它表现得很好,因为我还包装了$ http,我使用这样的东西:
var transport = $httpParamSerializerJQLike(data);
return $http.post(url, transport, { headers: { 'Content-type': 'application/x-www-form-urlencoded'}})