HTTP 요청에서 JSON 데이터를 다시 받기


90

제대로 작동하는 웹 요청이 있지만 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 클래스를 사용할 때 응답 콘텐츠를 얻는 방법을 묻고 있습니까?
파나지오티스 Kanavos

답변:


161

.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
이것을 테스트하지는 않았지만 ensureSuccessStatusCode의 문서에 "Content가 null이 아니면이 메서드는 Dispose를 호출하여 관리되는 리소스와 관리되지 않는 리소스를 해제합니다."라고 말합니다. 그래서 당신은 먼저 내용을 읽고 싶을 수 있습니다. msdn.microsoft.com/en-us/library/…
Ryan Williams

4
그럴 이유가 없습니다. Reflector에 의해 입증 된 바와 같이, ensureSuccessStatusCode는 예외를 던지기 직전에 상태 코드가 실패한 경우에만 폐기됩니다. 문서 텍스트가 약간 혼란스러운 또 다른 경우입니다.
Panagiotis Kanavos 2013

1
왜 안돼 client.GetStringAsync(...)? 2012 년이 아니 었습니다. 응답이 200옳지 않으면 둘 다 예외를 던질 까요?
Simon_Weaver

1
@Simon_Weaver는 질문이 아니었기 때문에 OP는 응답에서 문자열을 읽는 방법을 물었습니다. 가 있습니다 차이. 응답을 검사 할 수 없으므로 GetStringAsync응답 메시지가 무엇인지 알 수 없습니다. 3xx 응답이 반환되면 던지고 싶지 않을 것입니다 . 제한 오류가 반환되면 throw하지 않고 다시 시도 할 수 있습니다.
Panagiotis Kanavos

1
@Simon_Weaver가 많이 왜 안 - 그 전화를 걸 수있는 방법은 GetAsync<T>? 또는 GetStreamAsync 및 스트림을 Json.NET에 전달하여 임시 문자열을 피합니까? 다시, 사용하는 것이 바람직 할 수있다 GetAsync먼저 콘텐츠 객체 액세스
파나지오티스 Kanavos

39

바탕 @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;
}

이것은 단지 예일 뿐이며 HttpClientusing 절에서 사용하는 대신 공유 인스턴스 로 사용하고 싶을 것입니다 .


httpclient는 사용
구문

await가 즉시 반환 if (response != null)되기 때문에 post call이 완료되기 전에 실행될 수 있습니까?
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
ReadAsAsync가 확장 메서드라는 것을 id 추가라고 생각했습니다. .net 4+에는 System.Net.Http.Formatting을, .net 코어에는 Microsoft.AspNet.WebApi.Client를 사용해야합니다. 이 작업을 수행합니다.
Squibly

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;
    }

여기서 'model'은 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;
    }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.