Win32

2009-07-14 14 views
11

में देशी सी/सी ++ के लिए उच्च स्तरीय HTTP क्लाइंट लाइब्रेरी Win32 में देशी सी/सी ++ के लिए कोई "उच्च स्तरीय" HTTP लाइब्रेरी नहीं है या क्या मैं केवल गलत स्थानों को देख रहा हूं?Win32

"उच्च स्तरीय" से मेरा मतलब एक एपीआई है जो मुझे सीई ++ में HTTP वेब अनुरोध/प्रतिक्रियाओं को "उसी के बारे में" अबास्ट्रक्शन स्तर के साथ .NET फ्रेमवर्क के रूप में करने देता है (लेकिन ध्यान दें कि C++/CLI का उपयोग करना एक विकल्प नहीं है मेरे लिए)।

.NET का उपयोग किए बिना Win32 में C/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

डुप्लिकेट: http://stackoverflow.com/questions/822581/what-c-library-for-http-client –

उत्तर

8

Win32 Internet* फ़ंक्शंस प्रदान करता है।

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

तुम एक करने की आवश्यकता होगी (iirc, मैं 10 साल इन API छुआ है) InternetOpenURL और InternetReadFile

+0

यह उतना करीब है जितना मैं करना चाहता हूं, लेकिन अभी भी काफी नहीं है। मुद्दा यह है कि आपको "विदेशी" प्रॉक्सी परिदृश्य (ऑटो-प्रॉक्सी कॉन्फ़िगरेशन स्क्रिप्स, और वेब प्रॉक्सी ऑटोडिस्वरी प्रोटोकॉल) के लिए बहुत कुछ कोड लिखना होगा। –

+0

शायद मैं दाता हूं लेकिन ऑटो-प्रॉक्सी कॉन्फ़िगरेशन स्क्रिप्ट के लिए यह सिर्फ एक फ्लैग परिवर्तन इंटरनेट पर नहीं है? हालांकि WPAD पर कोई मदद नहीं दे सकता ... – Goz

+0

कुछ पूरी तरह से असंबंधित कुछ खोजते समय मैं इस पृष्ठ पर एमएसडीएन पर आया था? http://msdn.microsoft.com/en-us/library/aa383910.aspx यह आप से अतिरिक्त कोड का भार की आवश्यकता होती है, लेकिन यह विशेष रूप से जटिल :) – Goz

7

मुझे लगता है कि libcurl उन आवश्यकताओं से मेल खाता है। और फिर कुछ।

This example दिखाता है कि HTTP पृष्ठ कैसे प्राप्त करें, इसे केवल स्मृति में संग्रहीत करें। यह आपके उदाहरण की तुलना में थोड़ा अधिक कोड है, लेकिन यह सी

+0

यह एक अच्छा जवाब है - libcurl वास्तव में एक महान पुस्तकालय है और जो मैं अब तक उपयोग कर रहा हूं । हालांकि, यह प्रॉक्सी क्षेत्र में कम हो जाता है। उदाहरण के लिए, यह स्वचालित प्रॉक्सी कॉन्फ़िगरेशन स्क्रिप्ट्स (.NET कक्षाओं के रूप में) का समर्थन नहीं करता है। –

1

आप गलत स्थानों पर देख रहे हैं। यह सिर्फ दुखद वास्तविकता है। यही कारण है कि libcurl के लिए C++ wrapper है जिसे curlpp कहा जाता है।

नीचे एक वेब पेज को पुनः प्राप्त करने और इसे stdout स्ट्रीम पर प्रिंट करने के लिए example है।

#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 में क्रॉस प्लेटफ़ॉर्म नेटवर्किंग घटक भी हैं।

उदाहरण (यह त्रुटि जाँच फुलाना के बिना है) कुछ इस तरह के रूप में एक एफ़टीपी प्रोग्राम दे

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

क्यूटी लाइब्रेरी का हिस्सा, क्यूटीनेटवर्क भी एक संभावना है।

7

libcurl/curlpp के अलावा (जो लचीला और शक्तिशाली है लेकिन मुझे बहुत मिल गया है ... घबराहट) दो सी ++ पुस्तकालय हैं जिन पर मैं अपनी नजर रख रहा हूं। दोनों काफी नए हैं और बूस्ट :: एएसआईओ पर आधारित हैं। हालांकि न तो समर्थन प्रॉक्सी (जैसा कि मैं सबसे अच्छा बता सकता हूं)।

cpp-netlib (blog) शायद अधिक परिपक्व है (मुझे पता है कि इसमें कुछ वास्तविक दुनिया परीक्षण है) लेकिन वर्तमान में टाइमआउट की कमी है (मैं इस पर काम कर रहा हूं!)।उदाहरण:

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) ASIO निर्माता ने लिखा है और समय समाप्ति है (लेकिन केवल पिछले महीनेघोषणा की गई थी)। यह एक अलग मॉडल का उपयोग करता, धाराओं के साथ काम करने के लिए चुनने:

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

मैं मानता हूँ कि सी ++ HTTP लेकिन इन पुस्तकालयों के दोनों वादा का एक बहुत दिखाने के लिए महान समर्थन नहीं है।