2013-08-13 8 views
6

Jak wysłać żądanie POST z AngularJS? Część JSON jest wymagana, ale plik nie jest. Próbowałem tego na podstawie innych wpisów na blogu, ale to nie działa. Otrzymuję błąd Błąd żądania 400.Jak POST JSON i plik do serwisu internetowego z Angular?

200 punktów do prawidłowej odpowiedzi zostaną dodane

var test = { 
    description:"Test", 
    status: "REJECTED" 
}; 

var fd = new FormData(); 
fd.append('data', angular.toJson(test)); 

return $http.post('/servers', fd, { 
    transformRequest: angular.identity, 
    headers: { 
    'Content-Type': undefined 
    } 
}); 
+0

Tylko po to, aby wysłać jedno żądanie zarówno do zakodowanego pliku _i_ treści JSON? Czy możesz wyjaśnić przepływ, który chcesz uzyskać? –

+0

@Benjamin Gruenbaum: Tak, to prawda, wszystko w jednym wniosku. Utworzono backend Java Spring, który wymaga części JSON, która jest wymagana, oraz części pliku, która jest opcjonalna. Mam formularz, w którym użytkownik wprowadza dane, model jest następnie konwertowany na Json przez angular.toJson (..), a następnie chcę to opublikować. Użytkownik może również przesłać plik w tym samym formularzu. – LuckyLuke

+0

Hmmm, to może być trochę pracy lub dużo tego, jakie przeglądarki musisz obsługiwać? –

Odpowiedz

14

Przetestowałem kod z prostym wiosennym backend i działa prawidłowo:

@Controller 
public class FileController { 

    @ResponseBody 
    @RequestMapping(value = "/data/fileupload", method = RequestMethod.POST) 
    public String postFile(@RequestParam(value="file", required=false) MultipartFile file, 
         @RequestParam(value="data") Object data) throws Exception { 
    System.out.println("data = " + data); 

    return "OK!"; 
    } 
} 

Użyłem kodu po stronie klienta z kątowym v1.1.5:

var test = { 
    description:"Test", 
    status: "REJECTED" 
}; 

var fd = new FormData(); 
fd.append('data', angular.toJson(test)); 

//remove comment to append a file to the request 
//var oBlob = new Blob(['test'], { type: "text/plain"}); 
//fd.append("file", oBlob,'test.txt'); 

return $http.post('/data/fileupload', fd, { 
    transformRequest: angular.identity, 
    headers: { 
    'Content-Type': undefined 
    } 
}); 

Żądanie wygląda następująco (skopiowane z karty sieciowej konsoli Chrome):

Request URL:http://localhost:8080/data/fileupload 
Request Method:POST 
Status Code:200 OK 

Request Headers 
POST /data/fileupload HTTP/1.1 
Host: localhost:8080 
... 
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryEGiRWBFzWY6xwelb 
Referer: http://localhost:8080/ 
... 
Request Payload 
------WebKitFormBoundaryEGiRWBFzWY6xwelb 
Content-Disposition: form-data; name="data" 

{"description":"Test","status":"REJECTED"} 
------WebKitFormBoundaryEGiRWBFzWY6xwelb-- 

Odpowiedź 200 OK, a konsola wyprowadza oczekiwane: {"description":"Test","status":"REJECTED"}

+0

Hmm ... @ RequestParam mówisz, dlaczego w tym przypadku nie ma prawidłowego @RequestPart. Ponieważ to jest to, co mam w mojej aplikacji. Zmienię to i sprawdzę, czy to działa ... ale byłoby mi dobrze, gdybym wiedział, dlaczego powinienem go użyć :) – LuckyLuke

+0

A parametr danych, czy zamiast tego mogę zadeklarować poprawny typ? Czy muszę go rzucić z Object wewnątrz kontrolera? – LuckyLuke

+0

Po pierwsze, powinienem wspomnieć, że używam '@Bean public MultipartResolver multipartResolver() {return new CommonsMultipartResolver();}' w mojej konfiguracji Spring. Nie jestem pewien o '@ RequestPart' kontra' @ RequestParam'. Nie powinno być problemu z deklaracją parametru danych jako poprawnego typu, po prostu użyłem Object dla prostoty. – joakimbl

-3

można dodawać zawartość JSON bezpośrednio w danych POST.

$http.post(URI, JSON.stringify(test)); 

W zależności od specyfikacji interfejsu API może być konieczne dodanie typu zawartości.

$http.post(URI, JSON.stringify(test), {headers: {'Content-Type': 'application/json'}}); 
+1

Czy przeczytałeś pytanie? – LuckyLuke

+0

Niestety, wyrzucony przez "część JSON jest wymagana, ale plik nie jest". – user1498724