2014-09-03 19 views
5

Tôi muốn luôn thêm thông số vào các cuộc gọi Retrofit của mình. Đối với các giá trị mà tôi có thể mã khó, tôi có thể chỉ cần sử dụngTrang bị thêm: thêm tham số thời gian chạy vào giao diện?

@POST("/myApi?myParam=myValue") 

nhưng nếu tôi muốn nối thêm android.os.Build.MODEL thì sao?

@POST("/myApi?machineName="+ Build.MODEL) 

không hoạt động. Sẽ hữu ích khi có thể trừu tượng phần này của cuộc gọi mạng khỏi mã thực thi.

EDIT

tôi có thể thêm Build.MODEL cho tất cả các cuộc gọi api của tôi bằng cách sử dụng một RequestInterceptor. Tuy nhiên nó vẫn eludes tôi làm thế nào để thêm nó có chọn lọc để chỉ một số cuộc gọi api của tôi trong khi vẫn sử dụng cùng một RestAdapter.

EDIT 2

Cố định tiêu đề đó là tất cả các loại sai.

EDIT 3

thực hiện hiện tại:

RestAdapter restAdapter = new RestAdapter.Builder() 
      .setEndpoint("myapi") 
      .setRequestInterceptor(new RequestInterceptor() { 
       @Override 
       public void intercept(RequestInterceptor.RequestFacade request) { 
        request.addQueryParam("machineName", Build.MODEL); 
       } 
      }) 
      .build(); 
    API_SERVICE = restAdapter.create(ApiService.class); 
+0

Tôi hiện đang sử dụng một 'RequestInterceptor' để thêm tham số vào tất cả các cuộc gọi api, api sau đó bỏ qua các thông số bổ sung trên các cuộc gọi mà chúng không cần thiết. Điều này làm việc, nhưng làm cho mã ít rõ ràng hơn bởi vì nó không thể xác định các cuộc gọi cần những tham số mặc định vì vậy tôi để lại câu hỏi này mở. – GDanger

Trả lời

7

Build.MODEL không có sẵn để sử dụng trong một chú thích bởi vì nó không thể được giải quyết tại thời gian biên dịch. Nó chỉ có sẵn khi chạy (vì nó tải từ một thuộc tính).

Có hai cách để thực hiện việc này. Đầu tiên là sử dụng RequestInterceptor mà bạn đề cập đến trong câu hỏi.

Thứ hai là sử dụng thông số @Query trên phương pháp.

@POST("/myApi") 
Response doSomething(@Query("machineName") String machineName); 

Điều này yêu cầu bạn phải vượt qua Build.MODEL khi gọi API. Nếu bạn muốn, bạn có thể bọc giao diện Retrofit trong một API thân thiện hơn với lớp ứng dụng thực hiện điều này cho bạn.

+0

Có cách nào để nhắm mục tiêu có chọn lọc api nào gọi các chặn 'RequestInterceptor' và thêm tham số vào không? – GDanger

+0

No. Nó áp dụng cho tất cả các phương pháp hiện tại. –

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