从HTTP请求接收JSON数据

use*_*883 63 c# httpwebrequest

我有一个正常工作的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;
Run Code Online (Sandbox Code Playgroud)

api get方法

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

Pan*_*vos 123

如果您在.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();
Run Code Online (Sandbox Code Playgroud)

  • 尚未对此进行测试,但EnsureSuccessStatusCode的文档说"如果Content不为null,则此方法还将调用Dispose以释放托管和非托管资源." 所以你可能希望先阅读内容.http://msdn.microsoft.com/en-us/library/system.net.http.httpresponsemessage.ensuresuccessstatuscode(v=vs.110).aspx (3认同)
  • 没理由这个.正如Reflector所证明的那样,如果状态代码不成功,EnsureSuccessStatusCode将在抛出异常之前处置.另一种情况是文档文本有点令人困惑. (3认同)
  • 为什么不只是`client.GetStringAsync(...)`?那不是在 2012 年左右。如果响应不是“200”,他们都会抛出异常吗? (2认同)

ala*_*a27 22

从 Microsoft 安装这个 nuget 包System.Net.Http.Json。它包含扩展方法。

然后加 using System.Net.Http.Json

现在,您将能够看到这些方法:

在此处输入图片说明

所以你现在可以这样做:

await httpClient.GetFromJsonAsync<IList<WeatherForecast>>("weatherforecast");

来源:https : //www.stevejgordon.co.uk/sending-and-receiving-json-using-httpclient-with-system-net-http-json

  • 当有人使用非 getter 方法时,还有一个辅助方法从接收到的响应内容中提取 JSON——“ReadFromJsonAsync”。 (9认同)
  • 这是目前最简单的方法。 (3认同)

Wou*_*rck 19

基于@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;
}
Run Code Online (Sandbox Code Playgroud)

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

  • 请注意 httpclient 不会像 using 语句那样进行处理 (2认同)

Gre*_* Z. 9

我认为最短的方法是:

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>();
Run Code Online (Sandbox Code Playgroud)

  • 只是想添加 ReadAsAsync 是一种扩展方法。对于 .net 4+,您需要使用 System.Net.Http.Formatting,对于 .net core,需要使用 Microsoft.AspNet.WebApi.Client。让这个工作。 (9认同)