2010-01-09 38 views

Trả lời

2

Dưới đây là một ví dụ tốt và đầy đủ của một Restlet chấp nhận JSON qua POST:

Và một hướng dẫn cơ bản về cách để kiểm tra các dịch vụ web RESTful với cURL:

+2

trong ví dụ, dữ liệu vẫn được thông báo bằng tiêu chuẩn hình thức-url- mã hóa "name = value". Vậy làm thế nào tôi có thể POST một chuỗi có định dạng JSON {"name": "value"}? – portoalet

+0

Liên kết đầu tiên rất cũ. Rất nhiều thứ được làm bằng tay, nơi chúng có thể được thực hiện tự động. ** Được cảnh báo ** –

+0

Liên kết đầu tiên đã chết. – zionpi

10

Với Restlet 2, bạn có thể:

  • kiểm tra các đơn vị truyền thông kiểu tương thích trong @Post acceptRepresentation(Representation entity):

    @Post 
    public Representation acceptRepresentation(Representation entity) 
         throws ResourceException { 
        if (entity.getMediaType().isCompatible(MediaType.APPLICATION_JSON)) { 
         // ... 
        } 
        // ... 
    } 
    
  • hoặc sử dụng @Post với một hoặc hai tham số:

    @Post("json") Representation acceptAndReturnJson(Representation entity) { 
        // ... 
    } 
    

Xem những liên kết này: (. Với Restlet 1, bạn sẽ cần phải kiểm tra các loại thực thể)

+0

Xin lỗi vì đã xáo trộn, nhưng tôi không thể tìm thấy một cách đơn giản để chuyển đổi JSONRepresentation thành POJO. –

+0

Liên kết thứ 2 bị hỏng. – Chloe

6

Ví dụ liên quan đến bằng Daniel Vassallo hiển thị dữ liệu được đăng bằng cách sử dụng biểu mẫu. Đây là cách để gửi JSON:

@Post 
public void acceptJsonRepresentation(JsonRepresentation entity) { 

    JSONObject json = null; 

    try { 
     json = entity.getJsonObject(); 
     // business logic and persistence 

    } catch (JSONException e) { 
     setStatus(Status.CLIENT_ERROR_BAD_REQUEST); 
     return; 
    } 

} 

Để kiểm tra với curl:

curl -X POST <your url> -H "Content-Type: application/json" -d '{"key" : "value"}' 

Các dấu nháy đơn ('') xung quanh các dữ liệu trong lệnh curl rất quan trọng.

+1

Xin lỗi vì đã xáo trộn, nhưng tôi không thể tìm thấy một cách đơn giản để chuyển đổi JSONRepresentation thành POJO. –

8

Khi viết câu trả lời này (2 năm sau câu hỏi của bạn), Restlet 2.1 yêu cầu các phụ thuộc thích hợp đáp ứng đúng cách và trả lời bằng JSON. Điểm là, ngoài "Unsupported media type" phản ứng, không có nhiều đầu mối về những gì đang xảy ra trong nội bộ.

Để kích hoạt loại phương tiện JSON, bạn cần phải bao gồm sự phụ thuộc vào org.restlet.ext.jackson; nếu bạn cần hỗ trợ cả XML và JSON, bạn cần phải bao gồm Jackson FIRST và sau đó org.restlet.ext.xstream, vì XStream cũng có khả năng biểu diễn JSON nhưng việc triển khai khá kém (như được mô tả trong tài liệu phục hồi, đây là đề xuất của tác giả).

Sau đó, bạn không thực sự cần bao gồm loại phương tiện trong chú thích và bạn chỉ cần bao gồm tiêu đề Content-Type thích hợp trong yêu cầu curl của bạn, tức là:

curl -X post -H "Content-Type: application/json" http://localhost:8080/login -d @login.json 
  • nơi login.json chứa các yêu cầu JSON thực tế.
  • đăng nhập được @Post phương pháp chú thích chấp nhận LoginRequest và đáp ứng với LoginResponse, cả hai khả năng XML và JSON loại phương tiện truyền thông

Tôi hy vọng, câu trả lời này sẽ giúp một ai đó lúc nào. :-)

0
curl -u uid:4c521655 -X POST -H "Content-Type: application/json" -d "type=Big&data="{\"name\":\"test\"}"" --dump-header headers 'http://localhost:8190/appli/add' 
3

Dưới đây là một số cập nhật về câu hỏi cũ này. Restlet hỗ trợ các chữ ký phương thức có chứa các bean. Trong những trường hợp như vậy, Restlet sẽ sử dụng bộ chuyển đổi đã đăng ký để cố gắng chuyển đổi/điền vào tải trọng đã nhận thành một cá thể bean. Điều này cũng đúng khi gửi nội dung cho khách hàng.

Đây là mẫu của một phương pháp để xử lý yêu cầu POST:

public class TestServerResource extends ServerResource { 
    @Post 
    public void test(TestBean bean) { 
     System.out.println(">> bean = " + bean.getMessage()); 
    } 
} 

bean chỉ có thể có cấu trúc sau:

public class TestBean { 
    private String name; 
    private String message; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getMessage() { 
     return message; 
    } 

    public void setMessage(String message) { 
     this.message = message; 
    } 
} 

Để làm cho công việc cơ chế như vậy, bạn chỉ có thể thêm phần mở rộng Jackson (org.restlet.ext.jackson) trong classpath của bạn. Bộ chuyển đổi tương ứng sẽ được đăng ký tự động dưới mui xe.

Yêu cầu curl là đơn giản và các dữ liệu để gửi phải được quy định

curl -X POST http://... -H "Content-Type: application/json" -d '{"name" : "myname","description":"my description"}' 

Hy vọng nó giúp bạn, Thierry

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