使用HttpListener和Angular的$ http.post而不是jQuery.Ajax

时间:2016-05-18 23:01:00

标签: c# jquery angularjs ajax httplistener

简单地分解 - 在我的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但是,我再次没有收到任何数据。

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'}})