2009-12-03 44 views
9

Tôi đang cố gắng sử dụng REST API từ Ứng dụng .NET của mình. Tất cả các API này đều được viết bằng JAVA. Tôi được yêu cầu chuyển thông tin đăng nhập xác thực vào tiêu đề HTTP. Làm cách nào tôi có thể vượt qua các thông tin xác thực này như 'DATE', 'AUTHORIZATION' và 'Accept' qua tiêu đề HTTP.Tiêu thụ API RESt từ .NET

Tôi có thể sử dụng lớp nào trong .NET để thực hiện tác vụ này. Bất cứ ai có thể giúp tôi với điều này?

Tất cả trợ giúp của bạn sẽ được đánh giá cao.

Ajish.

Trả lời

13

Cập nhật

Thư viện này hiện đã được thay thế bằng http://nuget.org/packages/Microsoft.Net.Http/2.1.10


Sử dụng các thư viện client Microsoft.Http đó là trong WCF REST Starter Kit Preview 2.

Đây là cách bạn có thể sử dụng nó:

var client = new HttpClient(); 
    client.DefaultHeaders.Authorization = new Credential("ArbitraryAuthHeader"); 
    client.DefaultHeaders.Date = DateTime.Now; 
    client.DefaultHeaders.Accept.Add("application/xml"); 

    var response = client.Get("http://example.org"); 

    var xmlString = response.Content.ReadAsString(); 
+0

ngay cả ở đây tôi không thể đặt/thay đổi tiêu đề ngày. – Ajish

+0

Tại sao không? Bạn có mắc lỗi gì không? –

+0

Khi tôi cố gắng thiết lập tiêu đề ngày, tôi nhận được một ngoại lệ nói 'Một ngoại lệ xảy ra trong một yêu cầu WebClient.'. Và tôi đã thử mà không có một tiêu đề ngày, tôi nhận được một lỗi trái phép 401 như thế này 'Máy chủ từ xa trả về lỗi: (401) Không được phép.'. – Ajish

1

Có một số cách bạn có thể làm điều này nhưng sử dụng các đối tượng WebRequest là nhanh nhất nếu bạn chỉ có một vài cuộc gọi để hoàn thành.

This site, có tổng quan tuyệt vời về quy trình.

+0

tôi đã cố gắng sử dụng cùng lớp HttpWebRequest và HttpWebResponse để gửi yêu cầu và nhận được câu trả lời tương ứng. Nhưng hiện tại vấn đề là tôi không thể thêm/đặt tiêu đề DATE của HttpWebRequest. Khi tôi cố gắng đặt tiêu đề DATE. Tôi nhận được một ngoại lệ nói rằng Tiêu đề này phải được sửa đổi bằng cách sử dụng thuộc tính thích hợp. Tên thông số: tên. Tôi đã cố gắng google một giải pháp cho việc này nhưng không đi .. Có bất kỳ điều gì tôi có thể làm để đặt tiêu đề DATE trong HttpWebRequest – Ajish

+0

Có vẻ như điều này sẽ không hoạt động. http://social.msdn.microsoft.com/Diễn đàn/en-US/netfxnetcom/thread/dba65027-3fb8-42ec-83e8-90bd77c42ca3/ Tôi sẽ xem xét nhận xét của Darrel. –

+0

Làm cách nào để thay đổi/đặt tiêu đề ngày trong .NET httpRequest? Khi tôi cố gắng thay đổi nó, tôi nhận được một lỗi. – Ajish

0

Mặc dù tên hơi gây hiểu nhầm, ADO.NET Data Services (là một phần của .NET 3.5) chứa các API cho cả việc trưng ra và sử dụng các dịch vụ dựa trên REST. Trong trường hợp của bạn, bạn có thể an toàn bỏ qua phần cho phép bạn để lộ các dịch vụ và tập trung vào phần khách hàng.

Nó hỗ trợ LINQ và tất cả các loại của lòng tốt, cho phép bạn truy vấn dịch vụ REST của bạn như thế này:

var selectedOrders = from o in context.Orders 
        where o.Freight > 30 
        orderby o.ShippedDate descending 
        select o; 

Có thêm về nó here. Hãy thử - Tôi đã rất hài lòng với nó cho đến nay.

+3

Vấn đề với ví dụ mà bạn đang đưa ra là bạn chỉ có thể thực hiện truy vấn LINQ đối với các điểm cuối dịch vụ dữ liệu của ADO.Net. Bạn không thể làm điều đó với các điểm cuối REST khác. OP sẽ không thể thực hiện điều này đối với các API Java của mình. –

4

Chỉ cần thêm một chút giá trị cho chủ đề này (tôi cũng đang tìm kiếm một cách để tiêu thụ một dịch vụ RESTful và dễ dàng cung cấp thông tin và đi qua này sợi ... tôi không có "ngày" yêu cầu), Aaron Skonnard đã viết một bài báo tuyệt vời về cách sử dụng Kit WCF REST của người khởi xướng gọi:

A Developer's Guide to the WCF REST Starter Kit

có một phần rất nhiều thông tin về làm thế nào để tiêu thụ một dịch vụ RESTful sử dụng HttpClient. Và đây là đoạn mã để nói chuyện với Twitter:

HttpClient http = new HttpClient("http://twitter.com/statuses/"); 
http.TransportSettings.Credentials = 
    new NetworkCredential("{username}", "{password}"); 
HttpResponseMessage resp = http.Get("friends_timeline.xml"); 
resp.EnsureStatusIsSuccessful(); 
ProcessStatuses(resp.Content.ReadAsStream()); 
Các vấn đề liên quan