2014-10-01 22 views
10

Mam bardzo proste .NET Web API gospodarzem w Azure, z dwóch bardzo prostych metod:

[EnableCors(origins: "http://simpleapiearl.azurewebsites.net", headers: "*", methods: "*")] 
public class EnvelopesController : ApiController { 
    // GET: api/Envelopes 
    public IEnumerable<string> Get() { 
     return new string[] { "value1", "value2" }; 
    } 

    // POST: api/Envelopes 
    public string Post([FromBody]Envelope env) { 
     return "rval: " + env + " (and my addition to env)"; 
    } 
} 

Utworzono simple plunk, aby wywołać te metody. W moim kodzie AngularJS wykonuję dwie bardzo proste wywołania $ http. GET działa dobrze. POST jednak zawsze zwraca "400 (złe żądanie)", a krótko w mojej konsoli WebStorm przez "XMLHttpRequestion nie może załadować ... Nieprawidłowy kod stanu HTTP 400".

Wszelkie sugestie doceniane!

EDYCJA !!

Witam, i dziękuję za bardzo szybkie odpowiedzi. Właśnie zdałem sobie sprawę, że zapomniałem dodać bardzo istotnych szczegółów.

Parametr do mojej metody POST to obiekt, który nazywam obiektem kopertowym, który zawiera dwie właściwości: listingId (int) i Description (string). Kiedy dodaję zakodowany w górę nagłówek Content-Type i przekazuję '{"listingId":1234, "Description":"some description"}' jako moje dane POST, parametr env w mojej metodzie POST na serwerze ma wartość NULL (to znaczy, że wydaje się niezdolny do parsowania dostarczonego JSON). Przepraszamy, zostało to pominięte w oryginalnym wpisie.

+0

Sprawdź, czy masz w formularzu jakieś żetony 'xsrf'. jeśli tak jest, nie zapomnij wysłać tego tokena. –

+0

Żądanie wstępnego skanowania (OPCJE) nie działa. Sprawdź, czy to pomaga http://stackoverflow.com/questions/17713412/cors-post-requests-not-working-options-bad-request-the-origin-is-not-allow – Chandermani

+0

możliwy duplikat [How do I POST dane formularza zakodowane za pomocą $ http w AngularJS?] (http://stackoverflow.com/questions/24710503/how-do-i-post-urlencoded-form-data-with-http-in-angularjs) – allenhwkim

Odpowiedz

17

Myślę, że ten post byłby pomocny.

How do I POST urlencoded form data with $http in AngularJS?

Domyślnie usługa http $ zmieni żądania wychodzącego przez szeregowania dane jako JSON, a następnie umieszczenie go z Content typu „application/json”. Gdy chcemy opublikować wartość jako FORMULARZ , musimy zmienić algorytm serializacji i opublikować dane z typem treści "application/x-www-form-urlencoded".

To jest zmodyfikowany pnkr od Ciebie. W Twoim kodzie brakuje konwersji JSON-a na zakodowany adres URL.

http://plnkr.co/edit/4aeEDz73qgHSfOv1sBgn?p=preview

$http({ 
    method: 'POST', 
    url: 'http://simpleApiEarl.azurewebsites.net/api/envelopes', 
    data: env, 
    headers: {'Content-Type': 'application/x-www-form-urlencoded'}, 
    transformRequest: function(obj) { 
     var str = []; 
     for(var p in obj) 
     str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p])); 
     return str.join("&"); 
    } 
    }). 
+0

Dzięki za bardzo podobna odpowiedź na to, co znalazłem niedawno. Rekwizyty! – EarlD

+0

np. Konfigurowanie '$ httpProvider.defaults' jest dobrym pomysłem, jeśli docelowy host się nie zmienia. – allenhwkim

+0

@allenhwkim Użyłem tego samego kodu w moim projekcie błąd nadal pozostaje i w opisie mówi "Invalid Json". Poprowadź mnie, aby rozwiązać problem. – Developer

Powiązane problemy