2016-06-09 4 views
0

웹 서비스를 사용할 웹 서비스 및 응용 프로그램을 만들어야합니다. MVC 컨트롤러에서 Web API 사용

나는 웹 API 프로젝트를 생성하고 내가 거기이 방법이 있습니다

namespace StudentListApi.Controllers 
{ 
    //[Authorize] 
    public class ValuesController : ApiController 
    { 
     StudentContext db = new StudentContext(); 
     // GET api/values 
     public IEnumerable<Student> GetStudents() 
     { 
      return db.Students; 
     } 
     //... 
    } 
} 

내가 컨트롤러에이 방법을 사용합니다. 내 MVC 사이트는 학생들의 데이터를 필요로합니다. 그리고보기에서이 데이터를 취합니다

public class HomeController : Controller 
{ 
    private const string APP_PATH = "http://localhost:2640"; 

    private Models.StudentListEntities db = new Models.StudentListEntities(); 

    public ActionResult Index() 
    { 

     //var students = db.Students.OrderByDescending(x => x.Id); 
     using (var client = new HttpClient()) 
     { 
      var students = client.GetAsync(APP_PATH + "/api/value").Result; 
      //return students.StatusCode.ToString(); 
      return View(students); 
     } 

    } 
} 

을하지만 작동하지 않습니다 내가 오류가 있습니다

오류는 러시아어,하지만 난 당신의 이름에서 이해할 수 있다고 생각 예외이며 그 항목 모델의 유형은 StudentList.Model.Student이어야하지만 HttpResponseMessage가 있습니다.

웹 서비스에서 데이터를 가져 오는 방법은 "StudentList.Model.Student" 유형으로 변환하고 View()으로 지정 하시겠습니까?

+0

패키지 nuget Newtonsoft를 사용할 수 있습니까? 그것은 JSON 문자열, XML인가요? 귀하의 API는 무엇을 반환합니까? – DGibbs

+0

Im noob, 나는 API가 무엇을 반환하는지 알지 못하고 어떻게 확인할 수 있는지 잘 모릅니다. –

답변

0

귀하의 언급 된 URL은 문자열입니다. URI 기반 주소를 사용해야한다고 생각합니다.

또한 GetAsync와 함께 async를 사용하고 키워드를 기다려야합니다. 이 도움이된다면

public class DataSourceController : Controller 
{ 
    HttpClient _client; 
    string webapiurl = "http://localhost:56472/api/DataSource"; 

    public DataSourceController() 
    { 
     _client = new HttpClient(); 
     _client.BaseAddress = new Uri(webapiurl); 
     _client.DefaultRequestHeaders.Accept.Clear(); 
     _client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
    } 


    // 
    // GET: /DataSource/ 
    public async Task<ActionResult> Index() 
    { 
     var ResponseMessage = await _client.GetAsync(webapiurl); 

     if(ResponseMessage.IsSuccessStatusCode) 
     { 

      var data = ResponseMessage.Content.ReadAsStringAsync().Result; 

      var datasource = JsonConvert.DeserializeObject<List<DataSourceInfo>>(data); 
      return View(datasource); 

     } 

     return View("Error"); 

    } 
} 

메가 샘플

아래

봅니다 참조하십시오.

+0

[link] (http://i.imgur.com/WCo8vpN.png) 쓰기가 존재하지 않습니다. –

+0

업데이트 된 코드보기 ... Newtonsoft.Json을 사용하여이 3 개의 네임 스페이스 -을 사용하기를 바랍니다. using System.Net.Http.Headers; using System.Threading.Tasks; – Sanket

+0

IT가 작동합니다! 큰 고맙지 만 오류가있어서 [편집] 코드 (http://imgur.com/uMDePu5) –

0

웹 서비스 호출을하기 때문에 호출의 응답을 역 직렬화해야합니다.
Deserialization의 종류는 Api에서 구성한 응답을 기반으로합니다.

그리고 Result.Content.ReadAsStringAsync() 값으로 처리해야합니다.

+0

좋아요.보기()로 가져 가고 있나요? 그리고 이것을 어떻게 볼 수 있습니까? 예를 들어 지금을 IEnumerable foreach는 (모델에서 VAR 항목) {모델링 한 는 항목 item.Name있다.성 –

+0

공공 ActionResult 지수()를 사용하여 { (var에 클라이언트 = 새로운 HttpClient를()) { VAR 내용 = client.GetAsync (APP_PATH + "/api/value").Result.Content; var students = JsonConvert.DeserializeObject > (content); 돌아 가기보기 (학생); } } 여기 콘텐츠가 Api의 Json Format에 있다고 가정합니다. Xml 형식 인 경우 XML 비 직렬화를 수행해야합니다. NB : NewtonSoft Nuget Package에서 'JsonConvert'유형을 얻습니다. – Boney

0
using (var client = new HttpClient()) 
{ 
    var students = client.GetAsync(APP_PATH + "/api/value").Result; 
    //return students.StatusCode.ToString(); 
    return View(students); 
} 

같은 경로 (APP_PATH + "/ API/값")하지만, 컨트롤러 이름 " 컨트롤러는"ValueControllerValuesController을 편집하거나 (그런 APP_PATH 당신의 경로를 변경 + "/api/values ​​")

api ("http://localhost:2640/api/values ")가 제대로 작동하는지 확인하려면 HomeController에서 요청 코드를 확인하십시오.

나는 콘솔 응용 프로그램에서 근무하고`Result` 무엇일까요

using (var client = new HttpClient()) 
{ 
    client.BaseAddress = new Uri("yourRootUrl"); 
    client.DefaultRequestHeaders.Accept.Clear(); 
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

    // New code: 
    HttpResponseMessage response = await client.GetAsync("api/values"); 
    if (response.IsSuccessStatusCode) 
    { 

     var res = Task.Factory.StartNew(() => { 
      var data = response.Content.ReadAsStringAsync(); 
      data.Wait(); 
      return JsonConvert.DeserializeObject<List<Student>>(data.Result); 
     }); 
     res.Wait(); 
     foreach (var s in res.Result) 
     { 
      Console.WriteLine(s.Name); 
     } 

    } 
} 
+0

예, 브라우저에서 제대로 작동하지만 HomeController에서는 작동하지 않습니다. Google 크롬 IM에서 xml 형식을 사용하는 경우 Internet Explorer에서 json 형식을 사용합니다. 이제 Deserialize를 사용해야한다는 것도 알고 있지만 제대로 작동하지 않습니다. 오류가 있습니다. –

+0

요청 코드를 어떻게 확인할 수 있습니까? –

+0

샘플 HttpClient를 사용하고 deserialize를 추가했습니다. application/json client.DefaultRequestHeaders.Accept.Clear();를 추가하는 것을 잊지 마십시오. 클라이언트의 기본 요청 헤더. –

관련 문제