2016-04-12 20 views
7

Mam ASP.NET WEB-API 2 aplikacja czarownica musi mieć POST metodę, która akceptuje JOSNstring z nieznanej strukturze z javascript.
Włączam cors i GET metody działają poprawnie, jednak przy wysyłaniu JSON z klienta parametr metody api jest zawsze null.
To mój api metoda:post JSON ciąg 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) 
    }; 
} 

i moja metoda klient:

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

Więc pytanie brzmi jak mogę pisać nieznaną JSON string z javascript i przyjmuję je jako ciąg w moim metody api ?

+0

try 'dane: {model: JSON.stringify (Test)}' –

+0

to daje mi 'odpowiedź do prefligtu żądanie nie przechodzi kontrolę kontroli dostępu: Nie„Dostęp -Control-Allow-Origin 'nagłówek jest obecny w komunikacie o błędzie żądanego zasobu ' – Yoav

+0

Nie JSON.stringify. Użyj danych: {wartość: Test} i kontroler (test łańcuchowy [FromBody]). To powinno zwrócić ciąg znaków. –

Odpowiedz

10

Edytowałem twój kod i działa dobrze.

Atrybut [FromBody] określa, że ​​parametr działania pochodzi wyłącznie z treści encji przychodzącego komunikatu HTTPRequestMessage.

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

Próbowałem twojej sugestii i to działa. Ale chcę znaleźć wyjaśnienie. Podany link zawiera złośliwe oprogramowanie –

+0

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

7

Albo traktują żądanie POST jako żądania HTTP generycznych i ręcznie analizowania ciała:

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

lub użyć generycznych JToken i niech serializer zajmiemy się resztą:

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

    var myField = model["fieldName"]; 

    return new HttpResponseMessage(HttpStatusCode.OK); 
} 

Notatki: w ten sposób nie trzeba zmieniać kodu po stronie klienta, ponieważ wciąż przechowujesz dane json, a nie ogólny ciąg znaków, który jest semantycznie właściwym wyborem, jeśli spodziewasz się, że klient będzie publikować serializowane JSON o bjects.

Referencje:

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

Powiązane problemy