2016-04-12 11 views
7

Ho una strega ASP.NET WEB-API 2 applicazione ha bisogno di avere un metodo che accetta un POSTJOSNstring con struttura sconosciuta da javascript.
I metodi abilitati cors e e GET funzionano correttamente, tuttavia quando si invia JSON dal client, il parametro del metodo di api è sempre null.
Questo è il mio metodo api:Messaggio JSON stringa WEB API

//parameters i tried: 
//[FromBody]string model 
//[FromBody]dynamic model 
//dynamic model 
public HttpResponseMessage Post(string model) 
{ 
    return new HttpResponseMessage() 
    { 
     Content = new StringContent("POST: Test message: " + model) 
    }; 
} 

e il mio metodo cliente:

function sendRequest() 
{ 
    var Test = {"Name":"some name"}; 
    var method = $('#method').val(); 

    $.ajax({ 
     type: method, 
     url: serviceUrl, 
     contentType: 'application/json; charset=utf-8', 
     data: JSON.stringify(Test)    
    }).done(function (data) 
    { 
     $('#value1').text(data); 
    }).error(function (jqXHR, textStatus, errorThrown) 
    { 
     $('#value1').text(jqXHR.responseText || textStatus); 
    }); 
} 

Quindi la domanda è come posso postare uno sconosciuto JSON string da javascript e lo accetto come una stringa nel mio metodo api ?

+0

prova 'data: {modello JSON.stringify (Test)}' –

+0

questo mi dà una 'risposta alla richiesta di verifica preliminare non passa di controllo di controllo di accesso: accesso No' L'intestazione -Control-Allow-Origin 'è presente sulla risorsa richiesta' messaggio di errore – Yoav

+0

Do not JSON.stringify. Usa dati: {valore: prova} e nel controller (test stringa [FromBody]). Questo dovrebbe restituire una stringa. –

risposta

10

Ho modificato il codice e funziona bene.

Un attributo [FromBody] specifica che un parametro di azione proviene solo dal corpo dell'entità del messaggio HTTPRequestMessage in entrata.

public class TestApiController : ApiController 
    { 
     // POST api/<controller> 
     [HttpPost] 
     public HttpResponseMessage Post([FromBody]string value) 
     { 
      return new HttpResponseMessage() 
      { 
       Content = new StringContent("POST: Test message: " + value) 
      }; 
     } 

    } 

function sendRequest() { 
    var Test = { "Name": "some name" }; 

    $.ajax({ 
     type: "POST", 
     url: "api/TestApi", 
     data: { '': JSON.stringify(Test) } 
    }).done(function (data) { 
     alert(data); 
    }).error(function (jqXHR, textStatus, errorThrown) { 
     alert(jqXHR.responseText || textStatus); 
    }); 
} 
+1

Ho provato il tuo suggerimento e funziona. Ma voglio trovare una spiegazione. Il link che hai fornito contiene malware –

+0

@ChristophAdamakis: https://docs.microsoft.com/en-us/aspnet/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web- api –

7

O trattare la richiesta POST come una richiesta HTTP generico e analizzare manualmente il corpo:

public async Task<HttpResponseMessage> Post(HttpRequestMessage request) 
{ 
    var jsonString = await request.Content.ReadAsStringAsync(); 

    // deserialize the string, or do other stuff 

    return new HttpResponseMessage(HttpStatusCode.OK); 
} 

Oppure utilizzare un JToken generica, e lasciare che il serializzatore fare il resto:

public HttpResponseMessage Post([FromBody] JToken model) 
{ 
    DoStuff(model); 

    var myField = model["fieldName"]; 

    return new HttpResponseMessage(HttpStatusCode.OK); 
} 

Note: in questo modo non è necessario modificare il codice lato client, perché si sta ancora postando dati JSON, non una stringa generica, che è semanticamente la scelta giusta se si prevede che il client pubblichi JSON serializzato o bjects.

Riferimenti:

http://bizcoder.com/posting-raw-json-to-web-api