如何使用HttpClient发送Ajax请求

时间:2014-10-02 17:54:39

标签: c# dotnet-httpclient

我有一个网站发送Ajax请求来检查数字的验证。我希望使用HttpClient在我的WPF应用程序中发送该请求。

它使用post方法,这里是请求网址:http://sim.mci.ir/chk-number-availability

以下是标题:

Accept: */*
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.5
Cache-Control: no-cache
Connection: keep-alive
Content-Length: 18
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Cookie: _ga=GA1.2.589400539.1410935105; JSESSIONID=33719B6BDA36C7C23A96B5E73F602B08; _gat=1
Host: sim.mci.ir
Pragma: no-cache
Referer: http://sim.mci.ir/first-step
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:32.0) Gecko/20100101 Firefox/32.0
X-Requested-With: XMLHttpRequest

这是唯一的价值:

number=09122175567

我以常见方式使用SendAsync()和PostAsync()方法,但它不起作用。我认为问题出在请求标题中。

3 个答案:

答案 0 :(得分:6)

HttpClient client = new HttpClient();
var content = new FormUrlEncodedContent(new Dictionary<string, string>() { 
    { "number", "09129457000" } 
});
client.DefaultRequestHeaders.Referrer = new Uri("http://sim.mci.ir/first-step");

var resp = await client.PostAsync("http://sim.mci.ir/chk-number-availability", content);
var repsStr = await resp.Content.ReadAsStringAsync();

这将返回false字符串

答案 1 :(得分:1)

好吧,实际上你不能使用HttpClient发送真正的AJAX请求,但你可以通过添加XMLHttpRequest来请求头像这样来模拟它:

client.DefaultRequestHeaders.Add("X-Requested-With", "XMLHttpRequest");

这是一个需要Microsoft.AspNet.WebApi.Client nuget包的Helper方法:

    private TResponse CreateHttpRequest<TRequest, TResponse>(Uri uri, TRequest request)
        where TRequest : class
        where TResponse : class, new()
    {
        using (var client = new HttpClient())
        {
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Add("X-Requested-With", "XMLHttpRequest");
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            //client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", _bearerToken);
            var response = client.PostAsJsonAsync(uri, request).Result;
            if (response.StatusCode == HttpStatusCode.OK)
            {
                return JsonConvert.DeserializeObject<TResponse>(response.Content.ReadAsStringAsync().Result);
            }
            else if(response.StatusCode == HttpStatusCode.Unauthorized)
            {
                throw new UnauthorizedException();
            }
            else
            {
                throw new InvalidOperationException();
            }
        }

    }

答案 2 :(得分:0)

您无法使用HttpClient发送AJAX请求。如果需要,可以发送异步HTTP请求。

AJAX是异步JavaScript + XML(它已经变得更广泛,意味着异步JavaScript +其他格式,例如Json),但它仍然是一种涉及JavaScript的浏览器技术。

HttpClient对JavaScript一无所知,你必须使用WebBrowser控件来执行JavaScript。

<强>更新

回顾这个问题,我发现很多看似有经验的开发人员不理解AJAX这个术语并将其与简单的异步HTTP请求混淆,这让我感到非常惊讶,所以我认为在这里提供更多信息会很有帮助

Ajax A 同步 JA vaScript和 X ML的简称,它允许网页发送/接收异步数据通过 XMLHttpRequest 序列化为 XML ,然后使用该数据动态更新页面,而无需重新加载整个页面,这些都是使用 JavaScript

现在,在过去的几年里,XML已经失去了光彩,因为事实上的格式化数据标准和 JSON 正在取而代之,而且这也影响了Ajax,你通常会看到格式化为与服务器通信时,JSON而不是XML。所以缩写AJA X 不再那么精确了;建议使用AJA J ,但它的使用并没有普及,所以人们仍然使用Ajax这个术语,实际上他们并没有发送/接收XML,但这并不是什么大问题,因为这两者基本上都非常与数据格式化方式类似:

  • 它仍然涉及JavaScript。
  • 发送/接收异步请求的网页/应用程序。
  • 支持JavaScript和XMLHttpRequest的网络浏览器。

根据上述背景,我希望清楚OP在这里尝试做什么,以及接受的答案,与Ajax几乎没有关系,因为它不涉及上述任何一点。事实上,它只是一个简单的HTTP请求。