2013-08-13 40 views
6

Làm cách nào để gửi yêu cầu POST với AngularJS? Phần JSON là bắt buộc nhưng tệp thì không. Tôi đã thử điều này dựa trên các bài đăng trên blog khác nhưng nó không hoạt động. Tôi nhận được Yêu cầu không hợp lệ 400 lỗi.Làm thế nào để POST JSON và một tập tin vào dịch vụ web với Angular?

200 điểm cho câu trả lời đúng sẽ được thêm vào

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

Chỉ cần đảm bảo rằng bạn muốn gửi một yêu cầu duy nhất cho cả nội dung JSON và tệp được mã hóa? Bạn có thể làm rõ về luồng bạn muốn nhận không? –

+0

@Benjamin Gruenbaum: Đúng vậy, tất cả trong một yêu cầu. Tôi đã tạo ra một phần phụ trợ Java Spring mà cần một phần JSON được yêu cầu, và một phần tệp là tùy chọn. Tôi có một hình thức mà người dùng nhập dữ liệu, sau đó mô hình được chuyển đổi thành Json bởi angular.toJson (..) và sau đó tôi muốn đăng bài đó. Người dùng cũng có thể chọn tải tệp lên trong cùng một biểu mẫu. – LuckyLuke

+0

Hmmm, đây có thể là một công việc nhỏ hoặc rất nhiều thứ, bạn phải hỗ trợ những trình duyệt nào? –

Trả lời

14

Tôi đã kiểm tra mã của bạn với một mùa xuân backend đơn giản và nó hoạt động tốt:

@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!"; 
    } 
} 

Tôi đã sử dụng mã phía khách hàng của bạn với v1.1.5 góc:

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

Yêu cầu có dạng như sau (được sao chép từ tab mạng của bảng điều khiển 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-- 

Trả lời 200 OK và giao diện điều khiển sẽ xuất ra dự kiến: {"description":"Test","status":"REJECTED"}

+0

Hmm ... @ RequestParam bạn nói, tại sao không phải là @RequestPart chính xác trong trường hợp này. Bởi vì đó là những gì tôi có trong ứng dụng của mình. Tôi sẽ thay đổi và kiểm tra nếu nó hoạt động sau đó ... nhưng nó sẽ hữu ích cho tôi để biết lý do tại sao tôi nên sử dụng thay vào đó :) – LuckyLuke

+0

Và param dữ liệu, thay vào đó tôi có thể khai báo đúng loại? Hay tôi phải bỏ nó từ Object bên trong bộ điều khiển? – LuckyLuke

+0

Trước tiên, tôi nên đề cập rằng tôi đang sử dụng '@Bean multipartResolver multipartResolver công cộng() {return new CommonsMultipartResolver();}' trong cấu hình Spring của tôi. Không chắc chắn về '@ RequestPart' so với' @ RequestParam'. Nó không phải là một vấn đề tuyên bố param dữ liệu như là loại chính xác, tôi chỉ cần sử dụng Object cho đơn giản. – joakimbl

-3

Bạn có thể gửi nội dung JSON trực tiếp trong các dữ liệu POST.

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

Tùy thuộc vào đặc tả API, bạn có thể phải thêm loại nội dung.

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

Bạn đã đọc câu hỏi chưa? – LuckyLuke

+0

Xin lỗi về điều đó, đã bị bỏ qua bởi phần "JSON là bắt buộc nhưng tệp không phải là". – user1498724

Các vấn đề liên quan