C# 从HTTP请求接收JSON数据

C# 从HTTP请求接收JSON数据,c#,httpwebrequest,C#,Httpwebrequest,我有一个正常工作的web请求,但它只是返回状态OK,但我需要请求它返回的对象。我不确定如何获得我请求的json值。我刚开始使用对象HttpClient,是否有我遗漏的属性?我真的需要返回的对象。谢谢你的帮助 使调用运行正常将返回状态OK HttpClient client = new HttpClient(); client.DefaultRequestHeaders.Accept .Add(new MediaTypeWithQualityHeaderValue("application/j

我有一个正常工作的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中引用System.Net.HttpClient,则可以使用属性作为派生对象获取GetAsync返回的内容。然后,您可以使用该方法将内容读取到字符串中,或者使用该方法将内容读取为流

类文档包括以下示例:

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

@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;
}
使用System.Text;
使用System.Net.Http;
使用System.Threading.Tasks;
使用Newtonsoft.Json;//Nuget包
公共静态异步任务PostCallAPI(字符串url、对象jsonObject)
{
尝试
{
使用(HttpClient=new HttpClient())
{
var content=newstringcontent(jsonObject.ToString(),Encoding.UTF8,“application/json”);
var response=wait client.PostAsync(url、内容);
if(响应!=null)
{
var jsonString=await response.Content.ReadAsStringAsync();
返回JsonConvert.DeserializeObject(jsonString);
}
}
}
捕获(例外情况除外)
{
myCustomLogger.LogException(ex);
}
返回null;
}

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

我通常做的事情,类似于答案1:

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;
    }
var response=wait-httpClient.GetAsync(completeURL);//http://192.168.0.1:915/api/Controller/Object
if(response.issusccessstatuscode==true)
{
string res=wait response.Content.ReadAsStringAsync();
var content=Json.Deserialize(res);
//使用“内容”中的JSON做任何需要的事情
//例如:int id=content.id;
导航();
返回true;
}
其他的
{
等待JSRuntime.Current.InvokeAsync(“警报”、“警告,您输入的凭据不正确”);
返回false;
}

其中“model”是你的C#model类

我认为最短的方法是:

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>();
var-client=new-HttpClient();
字符串请求URL=$”http://myhost.mydomain.com/api/products/{ProdId}”;
var prodrep=await client.GetAsync(reqUrl);
如果(!prodResp.IsSuccessStatusCode){
失效要求();
}
var prods=await prodrep.Content.ReadAsAsync();

以下方法对我来说效果很好-

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;
    }
公共异步任务TestMethod(TestModel)
{
尝试
{
var apicallObject=new
{
Id=model.Id,
name=model.name
};
if(apicallObject!=null)
{
var bodyContent=JsonConvert.SerializeObject(apicallObject);
使用(HttpClient=new HttpClient())
{
var content=newstringcontent(bodyContent.ToString(),Encoding.UTF8,“application/json”);
content.Headers.ContentType=新的MediaTypeHeaderValue(“应用程序/json”);
client.DefaultRequestHeaders.Add(“访问令牌”,_令牌);//_令牌=访问令牌
var response=await client.PostAsync(_url,content);//u url=api端点url
if(响应!=null)
{
var jsonString=await response.Content.ReadAsStringAsync();
尝试
{
var result=JsonConvert.DeserializeObject(jsonString);//TestModel2=反序列化对象
}
捕获(例外e){
//味精
投掷e;
}
}
}
}
}
捕获(例外情况除外)
{
掷骰子;
}
返回null;
}

从Microsoft
System.Net.Http.Json
安装此nuget软件包。它包含扩展方法

然后使用System.Net.Http.Json添加

现在,您将能够看到以下方法:


因此,您现在可以执行以下操作:

等待httpClient.GetFromJsonAsync(“天气预报”)


来源:

您是否询问在使用.NET 4.5 HttpClient类时如何获取响应内容?尚未对此进行测试,但EnsureSuccessStatusCode的文档说明“如果内容不为null,此方法还将调用Dispose以释放托管和非托管资源”。因此您可能希望先阅读内容。没有理由这样。正如Reflector所证明的那样,只有在状态代码未成功时,才会在引发异常之前处理InsureSuccessStatusCode。还有一种情况,文档文本有点混乱。为什么不干脆
client.GetStringAsync(…)
?那不是2012年的事。如果响应不是
200
对吗?@Simon_Weaver,他们都会抛出一个异常,因为这不是问题所在-OP询问如何从响应中读取字符串。这是有区别的。您不能使用
GetStringAsync
检查响应,这意味着您不知道响应消息是什么。如果返回3xx响应,您可能不想抛出。如果返回节流错误,您可能希望重试而不抛出。@Simon_Weaver有很多方法可以进行调用-为什么不
GetAsync
?或GetStreamAsync,并将流传递到Json.NET,避免临时