Ce returnează HttpResponseMessage ca Json (Programare, C#, Json, Asp.Net Web Api)

Mario Nic a intrebat.

Am o întrebare de bază despre noțiuni de bază despre Web Api. Ca să știi, am mai verificat înainte dar nu am găsit ceea ce căutam.

Am o bucată de cod așa cum este descrisă mai jos aceste rânduri. La fel ca orice altă metodă în termeni generali metoda mea numită: Post, ea trebuie să returneze ceva, un JSON de exemplu, Cum fac asta. Mai exact, ce ar trebui să scriu după cuvântul ” return ” pentru a obține cele 3 câmpuri( loginRequest.Username,loginRequest.Password,loginRequest.ContractItemId ) ca Json.Coments: Nu vă faceți griji cu privire la numele de utilizator, parola și ID contract sunt în comentarii, eu obțin valoarea lor în LinQ. Este doar întoarcerea whta am nened acum, salutări tuturor celor care ar dori să arunce câteva note despre acest lucru.

    [System.Web.Http.HttpPost]
    public HttpResponseMessage Post(LoginModel loginRequest)
    {
        //loginRequest.Username = "staw_60";
        //loginRequest.Password = "john31";
        //loginRequest.ContractItemId = 2443;

      try
        {
           Membership member =
                (from m in db.Memberships
                 where
                     m.LoginID == loginRequest.Username 
                 && m.Password == loginRequest.Password 
                 && m.ContractItemID == loginRequest.ContractItemId
                 select m).SingleOrDefault();   
        }
       catch (Exception e)
       {
            throw new Exception(e.Message);
       }

      return ???;      
    }

Comentarii

  • OT: catch (Exception e) { throw new Exception(e.Message); } este un teribil idee. Mult noroc în urmărirea oricăror erori fără un tip de excepție sensibil sau o urmă de stivă! –  > Por Richard Deeming.
  • @Adriano acesta nu este MVC, ci este Web-API așa că este puțin diferit. –  > Por Erik Philips.
  • @RichardDeeming Aș include, de asemenea, că gestionarea corectă a erorilor în acest caz este de a catch (Exception e) { throw; }. Mi-aș închipui că codul este acolo pentru depanarea punctelor de întrerupere, dar o întrerupere poate fi pusă în continuare pe throw și să aibă debugablility. –  > Por Erik Philips.
  • @ErikPhilips: Pot vedea punctul de depanare a codului, dar în codul de producție aș fi înclinat să lase în afară de try...catch în întregime. –  > Por Richard Deeming.
  • @RichardDeeming sau cel puțin să facă ceva util, cum ar fi înregistrarea și trimiterea înapoi a unei HttpResponseMessage cu un 500 sau ceva de genul ăsta. –  > Por Erik Philips.
2 răspunsuri
vendettamit

Încearcă asta:

HttpResponseMessage response = new HttpResponseMessage();
response.Content = new ObjectContent<Response>(
        new Response() { 
                        responseCode = Response.ResponseCodes.ItemNotFound 
                       }, 
                       new JsonMediaTypeFormatter(), "application/json");

sau doar creați un alt răspuns din obiectul Request în sine.

return Request.CreateResponse<Response>(HttpStatusCode.OK, 
      new Response() { responseCode = Response.ResponseCodes.ItemNotFound })

De asemenea, puteți transforma toate tipurile de răspuns în JSON prin actualizarea HttpConfiguration(Formatter.Remove) doar eliminați serializarea xml implicită și puneți JSON.

Comentarii

  • FYI: Puteți utiliza JsonMediaTypeFormatter.DefaultMediaType.MediaType în loc să codificați șirul media. 😉 –  > Por James Wilkins.
  • De ce forțează această metodă tipul de conținut? Ce se întâmplă dacă utilizatorul API-ului preferă cererile XML și altul preferă JSON? Ar fi mult mai preferabil să se returneze tipul pe care l-a specificat cererea. –  > Por Talon.
user1429080

Ați putea, poate, să creați un fișier LoginResponseModel clasă pe care să o puteți utiliza pentru a trimite înapoi către apelant informații despre succesul/nereușita încercării de autentificare. Ceva de genul:

public class LoginResponseModel
{
    public bool LoginSuccessful {get; set;}
    public string ErrorMessage {get; set;}
    public LoginResponseModel()
    {
    }
}

Apoi, dacă doriți, puteți returna aceste informații direct din controler:

[System.Web.Http.HttpPost]
public LoginResponseModel Post(LoginModel loginRequest)
{
    ...

    return new LoginResponseModel() { LoginSuccessful = true, ErrorMessage = "" };
}

Sau puteți folosi în continuare o clasă HttpResponseMessage ca tip de retur, dar să trimiteți un LoginResponseModel ca răspuns json:

[System.Web.Http.HttpPost]
public HttpResponseMessage Post(LoginModel loginRequest)
{
    ...

    var resp = Request.CreateResponse<LoginResponseModel>(
        HttpStatusCode.OK,
        new LoginResponseModel() { LoginSuccessful = true, ErrorMessage = "" }
    );
    return resp;
}