132

我有一个正常工作的 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获取方法

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

7 回答 7

211

如果您指的是 .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();
于 2012-06-07T09:06:04.213 回答
62

基于@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用作共享实例,而不是在 using 子句中使用它。

于 2018-07-02T10:27:02.680 回答
35

从 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

于 2020-06-14T01:37:06.030 回答
10

我认为最短的方法是:

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>();
于 2019-08-20T17:07:12.853 回答
2

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

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# 模型类。

于 2019-02-19T10:10:20.437 回答
2

通过以下方式对我来说工作正常 -

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;
    }
于 2019-11-21T08:23:56.407 回答
0

下面的代码用于访问您的 HttpResponseMessage 并从 HttpContent 中提取您的响应。

string result = ret.Result.Content.ReadAsStringAsync().Result;

根据您的业务将您的 json 转换为结构在我的情况下,BatchPDF 是一个复杂的对象,它由结果变量填充。

BatchPDF batchJson = JsonConvert.DeserializeObject<BatchPDF>(result);

return batchJson;
于 2022-02-08T21:31:57.513 回答