2009-07-14 20 views
11

Có không "cao cấp" thư viện HTTP cho bản C/C++ trong Win32 hay tôi chỉ tìm kiếm ở các vị trí sai?cao cấp thư viện client HTTP cho bản C/C++ trong Win32

Bằng cách "cấp cao" Ý tôi là một API cho phép tôi làm các yêu cầu HTTP web/phản ứng trong C++ với "về cùng một" mức độ trừu tượng như .NET framework (nhưng lưu ý rằng việc sử dụng C++/CLI không phải là một lựa chọn cho tôi).

Làm thế nào để làm điều gì đó như thế này (với khoảng cùng một lượng code) trong C/C++ trong Win32 mà không sử dụng NET? Để tham khảo, tôi bao gồm một mẫu mã để chỉ ra cách tôi làm điều đó trong C#.

byte[] fileBytes = null; 
bool successfulDownload = false; 
using (WebClient client = new WebClient()) 
{ 
    WebProxy proxy = WebProxy.GetDefaultProxy(); 
    client.Proxy = proxy; 
tryAgain: 
    try 
    { 
     fileBytes = client.DownloadData(fileUrl); 
     successfulDownload = true; 
    } 
    catch (WebException wEx) 
    { 
     if (wEx.Response != null && wEx.Response is HttpWebResponse) 
     { 
      string username = null, password = null; 
      bool userCanceled = false; 
      HttpStatusCode statusCode = ((HttpWebResponse)wEx.Response).StatusCode; 
      switch (statusCode) 
      { 
       case HttpStatusCode.ProxyAuthenticationRequired: 
        // This is just a convenience function defined elsewhere 
        GetAuthenticationCredentials(fileUrl, true, 
         out username, out password, out userCanceled); 
        if (!userCanceled) 
        { 
         client.Proxy.Credentials = new NetworkCredential(username, password); 
         goto tryAgain; 
        } 
        break; 
       case HttpStatusCode.Unauthorized: 
        // This is just a convenience function defined elsewhere 
        GetAuthenticationCredentials(fileUrl, false, 
         out username, out password, out userCanceled); 
        if (!userCanceled) 
        { 
         client.Credentials = new NetworkCredential(username, password); 
         goto tryAgain; 
        } 
        break; 
      } 
     } 
    } 
} 
+0

trùng lặp: http://stackoverflow.com/questions/822581/what-c-library-for-http-client –

Trả lời

8

Win32 cung cấp Internet* chức năng.

http://msdn.microsoft.com/en-us/library/aa385473(VS.85).aspx

Bạn sẽ cần phải làm một (IIRC, tôi đã không đụng các API này trong hơn 10 năm) InternetOpenURLInternetReadFile.

+0

Điều này là gần như nó được những gì tôi có ý định làm, nhưng vẫn không hoàn toàn ở đó. Vấn đề là bạn cần phải viết khá nhiều mã cho các kịch bản proxy "kỳ lạ" (các kịch bản cấu hình proxy tự động và Giao thức Tự động Phát hiện Proxy Web). –

+0

Có lẽ im là daft nhưng đối với kịch bản cấu hình proxy tự động không phải là nó chỉ là một thay đổi một lá cờ để InternetOpen? Không thể đưa ra bất kỳ trợ giúp trên WPAD mặc dù ... – Goz

+0

Trong khi tìm kiếm một cái gì đó hoàn toàn không liên quan tôi đã xem qua trang này trên MSDN? http://msdn.microsoft.com/en-us/library/aa383910.aspx Nó yêu cầu tải thêm mã từ bạn nhưng nó không trông đặc biệt phức tạp :) – Goz

7

Tôi nghĩ rằng libcurl khớp với các yêu cầu đó. Và sau đó, vài.

This example cho thấy làm thế nào để có được một trang HTTP, lưu trữ nó trong bộ nhớ chỉ. Nó là mã hơn một chút so với ví dụ của bạn, nhưng đó là trong C.

+0

Đây là câu trả lời hay - libcurl thực sự là một thư viện tuyệt vời và đó là những gì tôi đang sử dụng cho đến nay . Tuy nhiên, nó rơi ngắn trong khu vực proxy. Ví dụ, nó không hỗ trợ (như các lớp .NET làm) các kịch bản cấu hình proxy tự động. –

1

Bạn đang không tìm ở các vị trí sai. Đó chỉ là thực tế đáng buồn. Đó là lý do tại sao có C++ wrapper cho libcurl được gọi là curlpp.

Dưới đây là một số example cách truy cập trang web và in nó ra luồng xuất bản.

#include <curlpp/curlpp.hpp> 
#include <curlpp/Easy.hpp> 
#include <curlpp/Options.hpp> 


using namespace curlpp::options; 

int main(int, char **) 
{ 
    try 
    { 
    // That's all that is needed to do cleanup of used resources (RAII style). 
    curlpp::Cleanup myCleanup; 

    // Our request to be sent. 
    curlpp::Easy myRequest; 

    // Set the URL. 
    myRequest.setOpt<Url>("http://example.com"); 

    // Send request and get a result. 
    // By default the result goes to standard output. 
    myRequest.perform(); 
    } 

    catch(curlpp::RuntimeError & e) 
    { 
    std::cout << e.what() << std::endl; 
    } 

    catch(curlpp::LogicError & e) 
    { 
    std::cout << e.what() << std::endl; 
    } 

    return 0; 
} 
4

POCO cũng có các thành phần mạng đa nền tảng.

Các ví dụ đưa ra một chương trình FTP như một cái gì đó như thế này (Đây là nếu không có sự kiểm tra lỗi khuẩn)

Poco::Net::FTPStreamFactory::registerFactory(); 
std::ofstream localFile(inputFile, std::ios_base::out | std::ios_base::binary); 
Poco::URI uri(inputURL); 
std::auto_ptr<std::istream> ptrFtpStream(Poco::Net::URIStreamOpener::defaultOpener().open(uri)); 
Poco::StreamCopier::copyStream(*ptrFtpStream.get(), localFile); 
1

Một phần của thư viện Qt, QtNetwork, cũng là một khả năng.

7

Ngoài libcurl/curlpp (linh hoạt và mạnh mẽ nhưng tôi thấy rất ... clunky) có hai thư viện C++ tôi đang theo dõi. Cả hai đều khá mới và dựa trên Boost :: ASIO. Tuy nhiên không phải là proxy hỗ trợ (tốt nhất tôi có thể biết).

cpp-netlib (blog) có lẽ là trưởng thành hơn (tôi biết nó đã có một số thử nghiệm trong thế giới thực) nhưng hiện đang thiếu thời gian chờ (tôi đang làm việc trên đó!).Ví dụ:

network::http::request request("http://google.com"); 
network::http::client client; 
network::http::response response; 

response = client.get(request); 
if (response.status() == 200) 
{ 
    std::cout << body(response)); 
} 

Urdl (documentation) được viết bởi tác giả ASIO và có timeout (nhưng chỉ được công bố vào tháng trước ). Nó sử dụng một mô hình khác nhau, chọn để làm việc với những con suối:

urdl::istream is("http://google.com"); 
std::string line; 
while (std::getline(is, line)) 
{ 
    std::cout << line << std::endl; 
} 

Tôi đồng ý rằng C++ không có hỗ trợ tuyệt vời cho HTTP nhưng cả hai thư viện cho thấy rất nhiều hứa hẹn.

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