μΉ΄ν…Œκ³ λ¦¬ 보관물: C#

C#

μƒνƒœ μ½”λ“œκ°€ 포함 된 ASP.NET Core λ°˜ν™˜ JSON : public IHttpActionResult GetResourceData() {

.NET Core Web API μ»¨νŠΈλ‘€λŸ¬μ—μ„œ HTTP μƒνƒœ μ½”λ“œλ‘œ JSON을 λ°˜ν™˜ν•˜λŠ” μ˜¬λ°”λ₯Έ 방법을 μ°Ύκ³  μžˆμŠ΅λ‹ˆλ‹€. λ‚˜λŠ” 이것을 λ‹€μŒκ³Ό 같이 μ‚¬μš©ν•©λ‹ˆλ‹€ :

public IHttpActionResult GetResourceData()
{
    return this.Content(HttpStatusCode.OK, new { response = "Hello"});
}

이것은 4.6 MVC μ‘μš© ν”„λ‘œκ·Έλž¨μ— μžˆμ—ˆμ§€λ§Œ μ΄μ œλŠ” .NET Coreλ₯Ό μ‚¬μš©ν•˜μ—¬ IHttpActionResultκ°€μ§€κ³  ActionResult있고 λ‹€μŒκ³Ό 같이 μ‚¬μš© ν•˜μ§€ μ•ŠλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€ .

public ActionResult IsAuthenticated()
{
    return Ok(Json("123"));
}

κ·ΈλŸ¬λ‚˜ μ•„λž˜ 이미지와 같이 μ„œλ²„μ˜ 응닡은 μ΄μƒν•©λ‹ˆλ‹€.

Web API μ»¨νŠΈλ‘€λŸ¬κ°€ Web API 2μ—μ„œν–ˆλ˜ κ²ƒμ²˜λŸΌ HTTP μƒνƒœ μ½”λ“œλ‘œ JSON을 λ°˜ν™˜ν•˜κΈ°λ₯Ό μ›ν•©λ‹ˆλ‹€.



λ‹΅λ³€

a JsonResult둜 μ‘λ‹΅ν•˜λŠ” κ°€μž₯ 기본적인 버전 은 λ‹€μŒ κ³Ό κ°™μŠ΅λ‹ˆλ‹€.

// GET: api/authors
[HttpGet]
public JsonResult Get()
{
    return Json(_authorRepository.List());
}

κ·ΈλŸ¬λ‚˜ μžμ‹ μ˜ 응닡 μ½”λ“œλ₯Ό λͺ…μ‹œ 적으둜 처리 ν•  수 ​​없기 λ•Œλ¬Έμ— 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 데 λ„μ›€μ΄λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

μƒνƒœ κ²°κ³Όλ₯Ό μ œμ–΄ν•˜λŠ” ​​방법 ActionResult은 StatusCodeResultμœ ν˜• 을 ν™œμš©ν•  μˆ˜μžˆλŠ” κ³³ 을 λ°˜ν™˜ν•΄μ•Όν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€ .

예λ₯Ό λ“€λ©΄ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

// GET: api/authors/search?namelike=foo
[HttpGet("Search")]
public IActionResult Search(string namelike)
{
    var result = _authorRepository.GetByNameSubstring(namelike);
    if (!result.Any())
    {
        return NotFound(namelike);
    }
    return Ok(result);
}

μœ„μ˜ 두 μ˜ˆμ œλŠ” λͺ¨λ‘ Microsoft μ„€λͺ…μ„œμ—μ„œ μ œκ³΅ν•˜λŠ” ν›Œλ₯­ν•œ κ°€μ΄λ“œμ—μ„œ 제곡 ν•œ κ²ƒμž…λ‹ˆλ‹€. 응닡 데이터 ν˜•μ‹ν™”


μΆ”κ°€ 물건

λ‚΄κ°€ 자주 μ ‘ν•˜λŠ” λ¬Έμ œλŠ” VS의 β€œNew Projectβ€ν…œν”Œλ¦Ώμ—μ„œ κΈ°λ³Έ ꡬ성을 μ‚¬μš©ν•˜κΈ°λ³΄λ‹€λŠ” WebAPIλ₯Όλ³΄λ‹€ μ„Έλ°€ν•˜κ²Œ μ œμ–΄ν•˜κΈ°λ₯Ό μ›ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

λͺ‡ κ°€μ§€ κΈ°λ³Έ 사항이 μžˆλŠ”μ§€ ν™•μΈν•˜μ‹­μ‹œμ˜€ …

1 단계 : μ„œλΉ„μŠ€ ꡬ성

ASP.NET Core WebAPIκ°€ μƒνƒœ μ½”λ“œλ₯Ό μ™„μ „νžˆ μ œμ–΄ν•˜λ©΄μ„œ JSON Serialized Object둜 μ‘λ‹΅ν•˜λ„λ‘ν•˜λ €λ©΄ λ¨Όμ €μ—μ„œ 찾은 λ©”μ†Œλ“œμ— AddMvc()μ„œλΉ„μŠ€λ₯Ό ν¬ν•¨μ‹œμΌœμ•Όν•©λ‹ˆλ‹€ .ConfigureServicesStartup.cs

AddMvc()λ‹€λ₯Έ μš”μ²­ μœ ν˜•μ— λŒ€ν•œ 응닡과 ν•¨κ»˜ JSON 용 μž…λ ₯ / 좜λ ₯ 포맷터가 μžλ™μœΌλ‘œ 포함 λœλ‹€λŠ” 점에 μœ μ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.

ν”„λ‘œμ νŠΈμ— λͺ¨λ“  κΆŒν•œμ΄ ν•„μš” application/jsonν•˜κ³  λ‹€λ₯Έ μš”μ²­ μœ ν˜• (예 : ν‘œμ€€ λΈŒλΌμš°μ € μš”μ²­)을 ν¬ν•¨ν•˜μ—¬ μ‘λ‹΅ν•˜μ§€ μ•ŠλŠ” λ‹€μ–‘ν•œ μš”μ²­ μœ ν˜•μ— λŒ€ν•œ WebAPI의 λ™μž‘κ³Ό 같은 μ„œλΉ„μŠ€λ₯Ό μ—„κ²©ν•˜κ²Œ μ •μ˜ν•˜λ €λŠ” 경우 λ‹€μŒ μ½”λ“œ :

public void ConfigureServices(IServiceCollection services)
{
    // Build a customized MVC implementation, without using the default AddMvc(), instead use AddMvcCore().
    // https://github.com/aspnet/Mvc/blob/dev/src/Microsoft.AspNetCore.Mvc/MvcServiceCollectionExtensions.cs

    services
        .AddMvcCore(options =>
        {
            options.RequireHttpsPermanent = true; // does not affect api requests
            options.RespectBrowserAcceptHeader = true; // false by default
            //options.OutputFormatters.RemoveType<HttpNoContentOutputFormatter>();

            //remove these two below, but added so you know where to place them...
            options.OutputFormatters.Add(new YourCustomOutputFormatter());
            options.InputFormatters.Add(new YourCustomInputFormatter());
        })
        //.AddApiExplorer()
        //.AddAuthorization()
        .AddFormatterMappings()
        //.AddCacheTagHelper()
        //.AddDataAnnotations()
        //.AddCors()
        .AddJsonFormatters(); // JSON, or you can build your own custom one (above)
}

λ‹€λ₯Έ 직렬화 ν˜•μ‹ (protobuf, thrift λ“±)에 μ‘λ‹΅ν•˜λ €λŠ” 경우 μ‚¬μš©μž μ •μ˜ μž…λ ₯ / 좜λ ₯ 포맷터λ₯Ό μΆ”κ°€ ν•  μˆ˜μžˆλŠ” 방법도 ν¬ν•¨λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

μœ„μ˜ μ½”λ“œ λ©μ–΄λ¦¬λŠ” λŒ€λΆ€λΆ„ AddMvc()λ©”μ„œλ“œ 의 λ³΅μ œλ³Έμž…λ‹ˆλ‹€ . κ·ΈλŸ¬λ‚˜ ν…œν”Œλ¦Ώμ΄ 포함 된 사전 배솑 된 μ„œλΉ„μŠ€λ₯Ό μ‚¬μš©ν•˜λŠ” λŒ€μ‹  각각의 λͺ¨λ“  μ„œλΉ„μŠ€λ₯Ό μ •μ˜ν•˜μ—¬ 각 β€œκΈ°λ³Έβ€μ„œλΉ„μŠ€λ₯Ό 자체적으둜 κ΅¬ν˜„ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. μ½”λ“œ 블둝에 리포지토리 링크λ₯Ό μΆ”κ°€ν–ˆκ±°λ‚˜ GitHub λ¦¬ν¬μ§€ν† λ¦¬μ—μ„œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€ AddMvc() ..

μ²˜μŒμ—λŠ” 기본값을 κ΅¬ν˜„ν•˜μ§€ μ•Šκ³  기본값을 β€œμ·¨μ†Œβ€ν•˜μ—¬μ΄ 문제λ₯Ό ν•΄κ²°ν•˜λ €λŠ” λͺ‡ κ°€μ§€ μ•ˆλ‚΄μ„œκ°€ μžˆμŠ΅λ‹ˆλ‹€. ν˜„μž¬ μ˜€ν”ˆ μ†ŒμŠ€λ‘œ μž‘μ—…ν•˜κ³  μžˆλ‹€κ³  μƒκ°ν•˜λ©΄ 쀑볡 μž‘μ—…μž…λ‹ˆλ‹€. , λ‚˜μœ μ½”λ“œμ™€ μ†”μ§νžˆ 였래 μ‚¬λΌμ§ˆ μŠ΅κ΄€.


2 단계 : 컨트둀러 생성

λ‚˜λŠ” λ‹Ήμ‹ μ—κ²Œ λ‹Ήμ‹ μ˜ μ§ˆλ¬Έμ„ λΆ„λ₯˜ν•˜κΈ° μœ„ν•΄ λ‹Ήμ‹ μ—κ²Œ 정말 κ°„λ‹¨ν•œ 것을 보여쀄 κ²ƒμž…λ‹ˆλ‹€.

public class FooController
{
    [HttpPost]
    public async Task<IActionResult> Create([FromBody] Object item)
    {
        if (item == null) return BadRequest();

        var newItem = new Object(); // create the object to return
        if (newItem != null) return Ok(newItem);

        else return NotFound();
    }
}

3 단계 : 확인 λ‹Ήμ‹  Content-Typeκ³ΌAccept

μš”μ²­μ˜ 헀더 Content-Type와 Accept헀더가 μ˜¬λ°”λ₯΄κ²Œ μ„€μ • λ˜μ–΄ μžˆλŠ”μ§€ ν™•μΈν•΄μ•Όν•©λ‹ˆλ‹€ . κ·€ν•˜μ˜ 경우 (JSON), 당신은 그것을 μ„€μ •ν•˜κ³  싢을 κ²ƒμž…λ‹ˆλ‹€application/json .

μš”μ²­ ν—€λ”μ˜ 지정에 관계없이 WebAPIκ°€ κΈ°λ³Έκ°’μœΌλ‘œ JSON으둜 μ‘λ‹΅ν•˜λ„λ‘ν•˜λ €λ©΄ λͺ‡ κ°€μ§€ λ°©λ²•μœΌλ‘œ μˆ˜ν–‰ ν•  수 μžˆμŠ΅λ‹ˆλ‹€ .

방법 1
이전에 ꢌμž₯ ν•œ 기사 ( 응닡 데이터 ν˜•μ‹ν™” )에 ν‘œμ‹œλœ κ²ƒμ²˜λŸΌ 컨트둀러 / μ•‘μ…˜ μˆ˜μ€€μ—μ„œ νŠΉμ • ν˜•μ‹μ„ κ°•μ œ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ‚˜λŠ” 개인적 으둜이 접근법을 μ’‹μ•„ν•˜μ§€ μ•Šμ§€λ§Œ … μ™„μ „μ„±μ„μœ„ν•œ κ²ƒμž…λ‹ˆλ‹€.

νŠΉμ • ν˜•μ‹ κ°•μ œ 적용 κ°€λŠ₯ν•œ νŠΉμ • μž‘μ—…μ— λŒ€ν•œ 응닡 ν˜•μ‹μ„ μ œν•œν•˜λ €λ©΄ [μ œμž‘] ν•„ν„°λ₯Ό 적용 ν•  수 μžˆμŠ΅λ‹ˆλ‹€. [Produces] ν•„ν„°λŠ” νŠΉμ • μž‘μ—… (λ˜λŠ” 컨트둀러)에 λŒ€ν•œ 응닡 ν˜•μ‹μ„ μ§€μ •ν•©λ‹ˆλ‹€. λŒ€λΆ€λΆ„μ˜ 필터와 λ§ˆμ°¬κ°€μ§€λ‘œμ΄ 값은 μž‘μ—…, 컨트둀러 λ˜λŠ” μ „μ—­ λ²”μœ„μ—μ„œ 적용 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

[Produces("application/json")]
public class AuthorsController

[Produces]ν•„ν„°λŠ” λ‚΄μ˜ λͺ¨λ“  μž‘μ—…μ„ κ°•μ œλ‘œ
AuthorsControllerλ‹€λ₯Έ 포맀터가 μ‘μš© ν”„λ‘œκ·Έλž¨μ— λŒ€ν•œ ꡬ성 및 ν΄λΌμ΄μ–ΈνŠΈκ°€ 제곡 ν•œ κ²½μš°μ—λ„, JSON ν˜•μ‹μ˜ 응닡을 λ°˜ν™˜ν•˜λŠ” Acceptλ‹€λ₯Έ κ°€λŠ₯ν•œ ν˜•μ‹μ„ μš”μ²­ 헀더λ₯Ό.

방법 2
μ„ ν˜Έν•˜λŠ” 방법은 WebAPIκ°€ μš”μ²­ 된 ν˜•μ‹μœΌλ‘œ λͺ¨λ“  μš”μ²­μ— β€‹β€‹μ‘λ‹΅ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜,이 μš”κ΅¬ 된 ν˜•μ‹μ„ ν—ˆμš©ν•˜μ§€ μ•ŠλŠ” κ²½μš°μ—, λ‹€μŒ 가을 – λ‹€μ‹œ 초기 μƒνƒœλ‘œ (즉. JSON)

λ¨Όμ € μ˜΅μ…˜μ— λ“±λ‘ν•΄μ•Όν•©λ‹ˆλ‹€ (μ•žμ„œ μ–ΈκΈ‰ ν•œλŒ€λ‘œ κΈ°λ³Έ λ™μž‘μ„ λ‹€μ‹œ μž‘μ—…ν•΄μ•Ό 함).

options.RespectBrowserAcceptHeader = true; // false by default

λ§ˆμ§€λ§‰μœΌλ‘œ, μ„œλΉ„μŠ€ λΉŒλ”μ— μ •μ˜ 된 포맷터 λͺ©λ‘μ˜ μˆœμ„œλ₯Ό λ‹€μ‹œ μ •λ ¬ν•˜λ©΄ μ›Ή ν˜ΈμŠ€νŠΈλŠ” λͺ©λ‘μ˜ 맨 μœ„μ— μœ„μΉ˜ν•˜λŠ” 포맷터 (예 : μœ„μΉ˜ 0)둜 κΈ°λ³Έ μ„€μ •λ©λ‹ˆλ‹€.

μžμ„Έν•œ λ‚΄μš©μ€μ΄ .NET μ›Ή 개발 및 도ꡬ λΈ”λ‘œκ·Έ ν•­λͺ©μ„ μ°Έμ‘°ν•˜μ‹­μ‹œμ˜€.


λ‹΅λ³€

κ°€μž₯ 일반적인 μƒνƒœ μ½”λ“œμ— λŒ€ν•΄ 미리 μ •μ˜ 된 방법이 μžˆμŠ΅λ‹ˆλ‹€.

  • Ok(result)200응닡과 ν•¨κ»˜ λ°˜ν™˜
  • CreatedAtRoute201+ μƒˆλ‘œμš΄ λ¦¬μ†ŒμŠ€ URL을 λ°˜ν™˜
  • NotFound 보고 404
  • BadRequest400등을 λ°˜ν™˜

μ°Έμ‘° BaseController.cs및 Controller.csλͺ¨λ“  λ©”μ†Œλ“œμ˜ λͺ©λ‘.

κ·ΈλŸ¬λ‚˜ μ •λ§λ‘œ μ£Όμž₯ν•œλ‹€λ©΄ StatusCodeμ‚¬μš©μž μ •μ˜ μ½”λ“œλ₯Ό μ„€μ •ν•˜λŠ” 데 μ‚¬μš©ν•  μˆ˜λŠ” μžˆμ§€λ§Œ μ½”λ“œλ₯Ό 읽을 수 μ—†κ²Œ λ§Œλ“€κ³  헀더λ₯Ό μ„€μ •ν•˜κΈ° μœ„ν•΄ μ½”λ“œλ₯Ό λ°˜λ³΅ν•΄μ•Όν•©λ‹ˆλ‹€ (와 같은 CreatedAtRoute).

public ActionResult IsAuthenticated()
{
    return StatusCode(200, "123");
}

λ‹΅λ³€

ASP.NET Core 2.0을 μ‚¬μš©ν•˜λ©΄ 객체λ₯Ό λ°˜ν™˜ν•˜λŠ” 이상적인 방법 Web API은 MVC와 ν†΅ν•©λ˜κ³  λ™μΌν•œ κΈ°λ³Έ 클래슀λ₯Ό μ‚¬μš©ν•˜λŠ” 것 Controllerμž…λ‹ˆλ‹€.

public IActionResult Get()
{
    return new OkObjectResult(new Item { Id = 123, Name = "Hero" });
}

κ·Έκ²ƒμ„μ£Όμ˜ν•΄λΌ

  1. 200 OKμƒνƒœ μ½”λ“œ 와 ν•¨κ»˜ λ°˜ν™˜λ©λ‹ˆλ‹€ (의 Okμœ ν˜• μž„ ObjectResult)
  2. μ½˜ν…μΈ  ν˜‘μƒμ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€. 즉, Acceptμš”μ²­ 헀더에 따라 λ°˜ν™˜ λ©λ‹ˆλ‹€. Accept: application/xmlμš”μ²­μ΄ 전솑 되면 둜 λ°˜ν™˜λ©λ‹ˆλ‹€ XML. 아무것도 보내지 μ•ŠμœΌλ©΄ JSONκΈ°λ³Έκ°’μž…λ‹ˆλ‹€.

νŠΉμ • μƒνƒœ μ½”λ“œμ™€ ν•¨κ»˜ 보내야 ν•˜λŠ” ObjectResult경우 StatusCodeλ˜λŠ”λ₯Ό μ‚¬μš©ν•˜μ‹­μ‹œμ˜€. λ‘˜ λ‹€ λ™μΌν•œ μž‘μ—…μ„ μˆ˜ν–‰ν•˜κ³  컨텐츠 ν˜‘μƒμ„ μ§€μ›ν•©λ‹ˆλ‹€.

return new ObjectResult(new Item { Id = 123, Name = "Hero" }) { StatusCode = 200 };
return StatusCode( 200, new Item { Id = 123, Name = "Hero" });

λ˜λŠ” ObjectResult둜 더 μ„ΈλΆ„ν™”ν•˜μ‹­μ‹œμ˜€.

 Microsoft.AspNetCore.Mvc.Formatters.MediaTypeCollection myContentTypes = new Microsoft.AspNetCore.Mvc.Formatters.MediaTypeCollection { System.Net.Mime.MediaTypeNames.Application.Json };
 String hardCodedJson = "{\"Id\":\"123\",\"DateOfRegistration\":\"2012-10-21T00:00:00+05:30\",\"Status\":0}";
 return new ObjectResult(hardCodedJson) { StatusCode = 200, ContentTypes = myContentTypes };

νŠΉλ³„νžˆ JSON 으둜 λ°˜ν™˜ ν•˜λ €λ©΄ λͺ‡ κ°€μ§€ 방법이 μžˆμŠ΅λ‹ˆλ‹€.

//GET http://example.com/api/test/asjson
[HttpGet("AsJson")]
public JsonResult GetAsJson()
{
    return Json(new Item { Id = 123, Name = "Hero" });
}

//GET http://example.com/api/test/withproduces
[HttpGet("WithProduces")]
[Produces("application/json")]
public Item GetWithProduces()
{
    return new Item { Id = 123, Name = "Hero" };
}

κ·Έκ²ƒμ„μ£Όμ˜ν•΄λΌ

  1. λ‘˜ λ‹€ JSONμ„œλ‘œ λ‹€λ₯Έ 두 κ°€μ§€ λ°©μ‹μœΌλ‘œ μ‹œν–‰ λ©λ‹ˆλ‹€.
  2. λ‘˜ λ‹€ μ½˜ν…μΈ  ν˜‘μƒμ„ λ¬΄μ‹œν•©λ‹ˆλ‹€.
  3. 첫 번째 방법은 νŠΉμ • serializer둜 JSON을 적용 Json(object)ν•©λ‹ˆλ‹€.
  4. 두 번째 방법은 Produces()속성 ( ResultFilter)을contentType = application/json

곡식 λ¬Έμ„œ μ—μ„œ μžμ„Έν•œ λ‚΄μš©μ„ μ½μ–΄λ³΄μ‹­μ‹œμ˜€ . μ—¬κΈ°μ—μ„œ 필터에 λŒ€ν•΄ μ•Œμ•„λ³΄μ‹­μ‹œμ˜€ .

μƒ˜ν”Œμ— μ‚¬μš©λ˜λŠ” κ°„λ‹¨ν•œ λͺ¨λΈ 클래슀

public class Item
{
    public int Id { get; set; }
    public string Name { get; set; }
}

λ‹΅λ³€

λ‚΄κ°€ 생각해 λ‚Έ κ°€μž₯ μ‰¬μš΄ 방법은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

var result = new Item { Id = 123, Name = "Hero" };

return new JsonResult(result)
{
    StatusCode = StatusCodes.Status201Created // Status code here 
};

λ‹΅λ³€

이것이 κ°€μž₯ μ‰¬μš΄ ν•΄κ²°μ±…μž…λ‹ˆλ‹€.

public IActionResult InfoTag()
{
    return Ok(new {name = "Fabio", age = 42, gender = "M"});
}

λ˜λŠ”

public IActionResult InfoTag()
{
    return Json(new {name = "Fabio", age = 42, gender = "M"});
}

λ‹΅λ³€

enum을 μ‚¬μš©ν•˜μ—¬ 404/201 μƒνƒœ μ½”λ“œλ₯Ό μ‚¬μš©ν•˜λŠ” λŒ€μ‹ 

     public async Task<IActionResult> Login(string email, string password)
    {
        if (string.IsNullOrWhiteSpace(email) || string.IsNullOrWhiteSpace(password))
        {
            return StatusCode((int)HttpStatusCode.BadRequest, Json("email or password is null"));
        }

        var user = await _userManager.FindByEmailAsync(email);
        if (user == null)
        {
            return StatusCode((int)HttpStatusCode.BadRequest, Json("Invalid Login and/or password"));

        }
        var passwordSignInResult = await _signInManager.PasswordSignInAsync(user, password, isPersistent: true, lockoutOnFailure: false);
        if (!passwordSignInResult.Succeeded)
        {
            return StatusCode((int)HttpStatusCode.BadRequest, Json("Invalid Login and/or password"));
        }
        return StatusCode((int)HttpStatusCode.OK, Json("Sucess !!!"));
    }

λ‹΅λ³€

λ‚΄κ°€ μ—¬κΈ°μ„œ 찾은 λ©‹μ§„ λŒ€λ‹΅κ³Ό λ‚˜λŠ”μ΄ λ°˜ν™˜ μ§„μˆ μ„ λ³΄μ•˜κ³  StatusCode(whatever code you wish)νš¨κ³Όκ°€μžˆμ—ˆμŠ΅λ‹ˆλ‹€ !!!

return Ok(new {
                    Token = new JwtSecurityTokenHandler().WriteToken(token),
                    Expiration = token.ValidTo,
                    username = user.FullName,
                    StatusCode = StatusCode(200)
                });

이 글은 C# μΉ΄ν…Œκ³ λ¦¬λ‘œ λΆ„λ₯˜λ˜μ—ˆκ³  λ‹˜μ— μ˜ν•΄ 에 μž‘μ„±λμŠ΅λ‹ˆλ‹€.