从HTTP请求接收回JSON数据


91

我有一个可以正常运行的Web请求,但是它只是返回状态OK,但是我需要我要返回的对象。我不确定如何获取我所请求的json值。我是第一次使用对象HttpClient,是否缺少我想要的属性?我真的需要返回的对象。谢谢你的帮助

进行通话-运行正常会返回OK状态。

HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Accept
  .Add(new MediaTypeWithQualityHeaderValue("application/json"));
var responseMsg = client.GetAsync(string.Format("http://localhost:5057/api/Photo")).Result;

api get方法

//Cut out alot of code but you get the idea
public string Get()
{
    return JsonConvert.SerializeObject(returnedPhoto);
}

您是否在问使用.NET 4.5 HttpClient类时如何获取响应内容?
Panagiotis Kanavos 2012年

Answers:


162

如果在.NET 4.5中引用System.Net.HttpClient,则可以使用HttpResponseMessage.Content属性作为HttpContent派生的对象来获取GetAsync返回的内容。然后,您可以使用HttpContent.ReadAsStringAsync方法将内容读取为字符串,或者使用ReadAsStreamAsync方法将内容读取为流。

HttpClient的类文件包括该实施例中:

  HttpClient client = new HttpClient();
  HttpResponseMessage response = await client.GetAsync("http://www.contoso.com/");
  response.EnsureSuccessStatusCode();
  string responseBody = await response.Content.ReadAsStringAsync();

3
尚未对此进行测试,但是SecureSuccessStatusCode的文档说:“如果Content不为null,则此方法还将调用Dispose以释放托管和非托管资源。” 因此,您不妨先阅读内容。 msdn.microsoft.com/en-us/library/...
赖安·威廉斯

4
没有理由。正如Reflector所证明的那样,仅在状态代码不成功时,EnsureSuccessStatusCode才会处置,仅在引发异常之前。文档文本有些混乱的另一种情况。
Panagiotis Kanavos

1
为什么不只是client.GetStringAsync(...)?那不是在2012年200吗?如果回应不正确,他们俩都会抛出异常?
Simon_Weaver

1
@Simon_Weaver,因为这不是问题-OP询问如何从响应中读取字符串。有差异。您无法检查响应,GetStringAsync这意味着您不知道响应消息是什么。如果返回3xx响应,则可能希望抛出该异常。如果返回了限制错误,您可能想重试而不抛出错误。
Panagiotis Kanavos

1
@Simon_Weaver有很多拨打该电话的方法-为什么不GetAsync<T>呢?还是GetStreamAsync并将流传递到Json.NET,避免使用临时字符串?再次,可能优选的是使用GetAsync第一再访问内容对象
帕纳约蒂斯Kanavos

40

@Panagiotis Kanavos的答案为基础,以下是一个有效的方法示例,该方法还将返回响应作为对象而不是字符串:

using System.Text;
using System.Net.Http;
using System.Threading.Tasks;
using Newtonsoft.Json; // Nuget Package

public static async Task<object> PostCallAPI(string url, object jsonObject)
{
    try
    {
        using (HttpClient client = new HttpClient())
        {
            var content = new StringContent(jsonObject.ToString(), Encoding.UTF8, "application/json");
            var response = await client.PostAsync(url, content);
            if (response != null)
            {
                var jsonString = await response.Content.ReadAsStringAsync();
                return JsonConvert.DeserializeObject<object>(jsonString);
            }
        }
    }
    catch (Exception ex)
    {
        myCustomLogger.LogException(ex);
    }
    return null;
}

请记住,这只是一个示例,您可能希望将其HttpClient用作共享实例,而不是在使用子句中使用它。


请注意,httpclient不会通过使用声明进行这样的处理
rogue39nin

由于await立即返回,是否有可能if (response != null)在post调用完成之前执行?
Nishant


7

我认为最简单的方法是:

var client = new HttpClient();
string reqUrl = $"http://myhost.mydomain.com/api/products/{ProdId}";
var prodResp = await client.GetAsync(reqUrl);
if (!prodResp.IsSuccessStatusCode){
    FailRequirement();
}
var prods = await prodResp.Content.ReadAsAsync<Products>();

7
只是想想id再加上ReadAsAsync是一种扩展方法。您将需要为.net 4+使用System.Net.Http.Formatting,为.net核心使用Microsoft.AspNet.WebApi.Client。使它工作。
大概在

0

我通常做的,类似于回答一个:

var response = await httpClient.GetAsync(completeURL); // http://192.168.0.1:915/api/Controller/Object

if (response.IsSuccessStatusCode == true)
    {
        string res = await response.Content.ReadAsStringAsync();
        var content = Json.Deserialize<Model>(res);

// do whatever you need with the JSON which is in 'content'
// ex: int id = content.Id;

        Navigate();
        return true;
    }
    else
    {
        await JSRuntime.Current.InvokeAsync<string>("alert", "Warning, the credentials you have entered are incorrect.");
        return false;
    }

其中“模型”是您的C#模型类。


0

通过以下方式对我来说效果很好-

public async Task<object> TestMethod(TestModel model)
    {
        try
        {
            var apicallObject = new
            {
                Id= model.Id,
                name= model.Name
            };

            if (apicallObject != null)
            {
                var bodyContent = JsonConvert.SerializeObject(apicallObject);
                using (HttpClient client = new HttpClient())
                {
                    var content = new StringContent(bodyContent.ToString(), Encoding.UTF8, "application/json");
                    content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
                    client.DefaultRequestHeaders.Add("access-token", _token); // _token = access token
                    var response = await client.PostAsync(_url, content); // _url =api endpoint url
                    if (response != null)
                    {
                        var jsonString = await response.Content.ReadAsStringAsync();

                        try
                        {
                            var result = JsonConvert.DeserializeObject<TestModel2>(jsonString); // TestModel2 = deserialize object
                        }
                        catch (Exception e){
                            //msg
                            throw e;
                        }
                    }
                }
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
        return null;
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.