11
votes

Bibliothèque client HTTP de haut niveau pour Native C / C ++ à Win32

n'y a-t-il pas de bibliothèques HTTP "de haut niveau" pour Native C / C ++ dans Win32 ou Suis je cherche juste dans les mauvais endroits?

Par "haut niveau", je veux dire une API qui me permet de faire des demandes Web HTTP / réponses en C ++ avec "à peu près au même" niveau d'abstraction que le document .NET (mais note que l'utilisation de C ++ / CLI n'est pas une option pour moi). P>

Comment faire quelque chose comme ça (avec à propos de la même quantité de code) en C / C ++ dans Win32 sans utiliser .NET? En tant que référence, j'inclus un échantillon de code pour montrer comment je le ferais dans C #. P>

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;
            }
        }
    }
}


7 Réponses :


7
votes

Je pense libcurl correspond à ces exigences. Et puis certains.

Cet exemple montre comment obtenir une page HTTP, le stocker en mémoire seulement. C'est un peu plus de code que votre exemple, mais c'est en c.


1 commentaires

C'est une bonne réponse - libcurl est en effet une grande bibliothèque et que j'utilise jusqu'à présent. Cependant, il tombe courte dans la zone de proxy. Par exemple, il ne prend pas en charge (comme les classes .net le font) des scripts de configuration de proxy automatiques.



8
votes

win32 fournit les fonctions internet * .

http://msdn.microsoft.com/ EN-US / Bibliothèque / AA385473 (vs.85) .aspx

Vous aurez besoin de faire un (IIRC, je n'ai pas touché ces API dans plus de 10 ans) Internetopenurl et InternetReadfile .


4 commentaires

Ceci est aussi proche que possible à ce que j'ai l'intention de faire, mais toujours pas tout à fait là-bas. Le problème est que vous devez écrire un code assez de code pour les scénarios de proxy "exotiques" (scripts de configuration de proxy automatique et protocole autodiscovery proxy Web).


Peut-être que je suis DAFT mais pour les scripts de configuration de proxy automatique, cela n'est-ce pas juste un indicateur d'un indicateur sur InternetOpen? Je ne peux pas donner d'aide sur WPAD ...


Tout en cherchant quelque chose de complètement indépendant, je suis tombé sur cette page sur MSDN? msdn.microsoft.com/en-us/library/aa383910.aspx Cela nécessite une charge de code supplémentaire de votre part, mais cela n'a pas l'air particulièrement complexe :)


Merci GOZ, j'avais négligé le drapeau internet_open_type_preconfig à InternetOpen (). Ceci est exactement ce que je cherchais.



1
votes

Vous êtes pas strong> regarder dans les mauvais endroits. C'est juste la triste réalité. C'est pourquoi il y a une enveloppe C ++ pour libcurl appelée curlpp .

ci-dessous est un Exemple de la rétrécissement d'une page Web et d'imprimer-le sur STDOUT Stream. P>

#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;
}


0 commentaires

4
votes

POCO possède également des composants de réseautage croisé multiples.

Les exemples donnent un programme FTP comme quelque chose comme ça ( Ceci est sans que l'erreur vérifie la peluche) xxx


0 commentaires

0
votes

1
votes

Une partie de la bibliothèque QT, QTnetwork, est également une possibilité.


0 commentaires

7
votes

En dehors de libcurl / curlpp (qui est flexible et puissant, mais je trouve très ... Clunky) Il y a deux bibliothèques C ++ que je garde les yeux. Les deux sont assez nouveaux et basés sur Boost :: Asio. Cependant ni les proxies de support (au mieux que je peux dire).

CPP- NetLib ( blog ) est peut-être plus mature (je sais que cela a eu des tests du monde réel ) mais manque actuellement de délais d'attente (je travaille dessus!). Exemple: xxx

URDL ( Documentation ) est écrit par le créateur ASIO et a des délits (mais n'a été annoncé que le mois dernier ). Il utilise un modèle différent, optant au travail avec des flux: xxx

Je suis d'accord que C ++ n'a pas d'excellent support pour HTTP, mais ces deux bibliothèques montrent beaucoup de promesses.


0 commentaires