2017-08-01 112 views
0

我的Angular 4應用程序使用Spring Data REST API HATEOAS服務器,我使用的是HttpClient,我發現它返回Object而不是像http這樣的any。 我看過這個問題:Why does the httpclient in angular 4.3 return Object instead of any? 我知道了。我有很多這樣的領域複雜的JSON:Angular 4 HttpClient與HATEOAS REST服務器

{ 
    "_embedded": { 
    "customers": [ 
     { 
     "sid": "c44fdb6f-9b7c-4f75-8d4c-7542f54037b7", 
     "createdDate": "2017-08-01T13:06:23Z", 
     "lastModifiedDate": "2017-08-01T13:06:23Z", 
     "lastModifiedBy": "admin", 
     "name": "Customer 1", 
     "username": "customer1", 
     "address": "Via xxxxx", 
     "city": "Adria", 
     "landlinePhone": "+39042000000", 
     "mobilePhone": null, 
     "email": "[email protected]", 
     "fax": null, 
     "vatNumber": "IT01000020295", 
     "taxCode": null, 
     "iban": null, 
     "swift": null, 
     "enableEcommerce": true, 
     "balance": 0, 
     "enabled": true, 
     "new": false, 
     "_links": { 
      "self": { 
      "href": "....:8080/api/v1/customers/1" 
      }, 
      "customer": { 
      "href": "....:8080/api/v1/customers/1" 
      }, 
      "movements": { 
      "href": "....:8080/api/v1/customers/1/movements" 
      }, 
      "country": { 
      "href": "....:8080/api/v1/customers/1/country" 
      } 
     } 
     } 
    ] 
    }, 
    "_links": { 
    "self": { 
     "href": "....:8080/api/v1/customers{?page,size,sort}", 
     "templated": true 
    }, 
    "profile": { 
     "href": "....:8080/api/v1/profile/customers" 
    }, 
    "search": { 
     "href": "....:8080/api/v1/customers/search" 
    } 
    }, 
    "page": { 
    "size": 20, 
    "totalElements": 1, 
    "totalPages": 1, 
    "number": 0 
    } 
} 

的HttpClient不允許做response.page.totalElements因爲,就像我說的,響應類型是一個對象,而不是any類型。 我在想什麼是完成我的目標的最好方法;我有兩個想法:

  • 投下響應any。在這種情況下,我當然可以在沒有任何類型檢查的情況下訪問字段。

  • 創建幾個對象來映射HATEOAS響應:可能我需要至少2-3個接口,每個模型實體需要1個類。 與第一種解決方案相比,這種方法看起來相當複雜,可能過於複雜,我總是需要從對象到我的特定實體模型進行強制轉換;這意味着由於錯誤類型轉換,我可能會產生運行時異常。

你能不能給我一些建議和最佳實踐,以達到自己的目標,然後按照這個想法角的團隊畫了?

+0

您是否嘗試了回覆['page']。totalElements? – Mackelito

回答

2

我有同樣的問題,我發現一個可能的解決方案:

// Java: Spring Data REST Repository 
@RepositoryRestResource(collectionResourceRel = "result", path = "customers") 
public interface CustomerRepository extends PagingAndSortingRepository<Customer, Long> { 
} 

// TypeScript model 
export interface ListResult<T> { 
    _embedded: EmbeddedList<T>; 
    _links: any; 
    page: any; 
} 

export interface EmbeddedList<T> { 
    results: T[]; 
} 

export class Customer{ 
    name: String; 
    ... bla bla ... 
} 

// AJAX Call 
http.get('/api/customers').subscribe(response => { 
    const customers: Customer[] = response._embedded.results; 
}); 

所有庫必須有collectionResourceRel = 「結果」