Apakah ada cara untuk dengan mudah membuat permintaan HTTP dengan C ++? Secara khusus, saya ingin mengunduh konten suatu halaman (API) dan memeriksa konten untuk melihat apakah konten tersebut mengandung angka 1 atau 0. Apakah mungkin untuk mengunduh konten ke dalam sebuah string?
c++
httprequest
Sam152
sumber
sumber
Jawaban:
Saya memiliki masalah yang sama. libcurl sangat lengkap. Ada curlpp bungkus C ++ yang mungkin menarik bagi Anda saat Anda meminta pustaka C ++. neon adalah pustaka C lain yang menarik yang juga mendukung WebDAV .
curlpp tampak alami jika Anda menggunakan C ++. Ada banyak contoh yang disediakan dalam distribusi sumber. Untuk mendapatkan konten dari URL Anda melakukan sesuatu seperti itu (diekstraksi dari contoh):
Lihat
examples
direktori dalam distribusi sumber curlpp , ada banyak kasus yang lebih kompleks, serta yang lengkap sederhana minimal menggunakan curlpp.2 sen saya ...
sumber
os << myRequest.perform();
denganmyRequest.setOpt( new curlpp::options::WriteStream( &os ) ); myRequest.perform();
memberi hasil. Pastikan untuk tidak menggunakanhttp://example.com
, ini akan mengembalikan halaman kosong. Penggunaan yang lebih baik misalnyahttp://www.wikipedia.org
.Kode Windows:
Berikut ini adalah implementasi yang jauh lebih baik:
sumber
GET / HTTP/1.1.1/... etc
)? Bagaimana cara mengetahui cara memformat apa yang saya kirim?Pembaruan 2020: Saya punya jawaban baru yang menggantikan ini, sekarang berumur 8 tahun, satu: https://stackoverflow.com/a/61177330/278976
Di Linux, saya mencoba cpp-netlib, libcurl, curlpp, urdl, boost :: asio dan mempertimbangkan Qt (tetapi menolaknya berdasarkan lisensi). Semua ini tidak lengkap untuk penggunaan ini, memiliki antarmuka yang ceroboh, memiliki dokumentasi yang buruk, tidak terawat atau tidak mendukung https.
Kemudian, atas saran https://stackoverflow.com/a/1012577/278976 , saya mencoba POCO. Wow, saya berharap saya telah melihat ini tahun lalu. Berikut adalah contoh membuat permintaan HTTP GET dengan POCO:
https://stackoverflow.com/a/26026828/2817595
POCO gratis, open source (meningkatkan lisensi). Dan tidak, saya tidak memiliki afiliasi dengan perusahaan; Saya sangat suka antarmuka mereka. Pekerja hebat (dan cewek).
https://pocoproject.org/download.html
Semoga ini bisa membantu seseorang ... saya butuh tiga hari untuk mencoba semua perpustakaan ini.
sumber
Ada pembungkus ikal yang lebih baru dan kurang matang yang dikembangkan disebut Permintaan C ++ . Berikut permintaan GET sederhana:
Ini mendukung berbagai pilihan kata kerja HTTP dan opsi ikal. Ada lebih banyak dokumentasi penggunaan di sini .
Penafian: Saya adalah pengelola perpustakaan ini .
sumber
Ini adalah pembungkus minimal saya di sekitar CURL untuk dapat mengambil halaman web sebagai string. Ini berguna, misalnya, untuk pengujian unit. Ini pada dasarnya adalah pembungkus RAII di sekitar kode C.
Instal "libcurl" pada mesin Anda
yum install libcurl libcurl-devel
atau yang setara.Contoh penggunaan:
Implementasi kelas:
sumber
libCURL adalah opsi yang cukup bagus untuk Anda. Bergantung pada apa yang perlu Anda lakukan, tutorial harus memberi tahu Anda apa yang Anda inginkan, khususnya untuk penanganan yang mudah. Tetapi, pada dasarnya, Anda bisa melakukan ini hanya untuk melihat sumber halaman:
Saya percaya ini akan menyebabkan hasil untuk dicetak menjadi stdout. Jika Anda ingin menanganinya - yang, saya asumsikan, Anda lakukan - Anda perlu mengatur CURL_WRITEFUNCTION. Semua itu tercakup dalam tutorial ikal yang ditautkan di atas.
sumber
Karena Anda menginginkan solusi C ++, Anda bisa menggunakan Qt . Ini memiliki kelas QHttp yang dapat Anda gunakan.
Anda dapat memeriksa dokumen :
Qt juga memiliki lebih banyak hal yang dapat Anda gunakan dalam aplikasi C ++ umum.
sumber
QNetworkAccessManager
telah didokumentasikan sejak Qt 4.4; dan dalam Qt 4.8 mengatakan:QHttp - This class is obsolete. It is provided to keep old source code working. We strongly advise against using it in new code.
Jadi saya kira itu masih tersedia, jika Anda mengabaikan peringatan yang sudah usang.Anda mungkin ingin memeriksa C ++ REST SDK (nama kode "Casablanca"). http://msdn.microsoft.com/en-us/library/jj950081.aspx
Dengan C ++ REST SDK, Anda dapat lebih mudah terhubung ke server HTTP dari aplikasi C ++ Anda.
Contoh penggunaan:
C ++ REST SDK adalah proyek Microsoft untuk komunikasi klien-server berbasis cloud dalam kode asli menggunakan desain C ++ API asinkron modern.
sumber
Dengan jawaban ini saya merujuk ke jawaban dari Software_Developer . Dengan membangun kembali kode saya menemukan bahwa beberapa bagian sudah usang (
gethostbyname()
) atau tidak memberikan penanganan kesalahan (pembuatan soket, mengirim sesuatu) untuk operasi.Kode windows berikut ini diuji dengan Visual Studio 2013 dan Windows 8.1 64-bit serta Windows 7 64-bit. Ini akan menargetkan Koneksi TCP IPv4 dengan Server Web dari www.google.com.
Referensi:
Penghentian gethostbyname
Nilai Pengembalian soket ()
Nilai Pengembalian kirim ()
sumber
C ++ tidak menyediakan cara untuk melakukannya secara langsung. Ini sepenuhnya tergantung pada platform dan perpustakaan apa yang Anda miliki.
Pada kasus terburuk, Anda dapat menggunakan pustaka boost :: asio untuk membuat koneksi TCP, mengirim header HTTP (RFC 2616), dan mem-parsing respons secara langsung. Melihat kebutuhan aplikasi Anda, ini cukup sederhana untuk dilakukan.
sumber
Berikut adalah beberapa kode yang akan berfungsi tanpa perlu menggunakan perpustakaan pihak ke-3 mana pun: Pertama-tama tentukan gateway, pengguna, kata sandi Anda dan parameter lain apa pun yang perlu Anda kirim ke server khusus ini.
Ini kodenya sendiri:
Itu seharusnya bekerja pada lingkungan API Win32.
Berikut ini sebuah contoh .
sumber
InternetConnect
mengembalikan nol ketika URL lengkap diberikan, tetapi mengembalikan nilai bukan nol ketika hanya nama domain yang diberikan. Jadi kapan / di mana saya menggunakan URL lengkap untuk mendapatkan halaman yang ingin saya unduh?Jawaban yang diperbarui untuk April, 2020:
Saya baru saja mendapatkan banyak keberhasilan, dengan cpp-httplib (baik sebagai klien maupun server). Ini matang dan perkiraannya, RPS single-threaded sekitar 6k.
Pada lebih banyak sisi pendarahan, ada kerangka kerja yang sangat menjanjikan, cpv-framework , yang bisa mendapatkan sekitar 180k RPS pada dua core (dan akan berskala baik dengan jumlah core karena didasarkan pada kerangka seastar , yang mendukung DB tercepat di planet ini, scylladb ).
Namun, kerangka kerja cpv masih relatif belum matang; jadi, untuk sebagian besar penggunaan, saya sangat merekomendasikan cpp-httplib.
Rekomendasi ini menggantikan jawaban saya sebelumnya (8 tahun yang lalu).
sumber
C dan C ++ tidak memiliki pustaka standar untuk HTTP atau bahkan untuk koneksi soket. Selama bertahun-tahun beberapa perpustakaan portabel telah dikembangkan. Yang paling banyak digunakan, seperti yang dikatakan orang lain, adalah libcurl .
Berikut adalah daftar alternatif untuk libcurl (berasal dari situs web libcurl).
Juga, untuk Linux, ini adalah klien HTTP sederhana. Anda dapat mengimplementasikan klien HTTP GET sederhana Anda sendiri, tetapi ini tidak akan berhasil jika ada otentikasi atau pengalihan yang terlibat atau jika Anda perlu bekerja di belakang proxy. Untuk kasus ini, Anda memerlukan pustaka lengkap seperti libcurl.
Untuk kode sumber dengan libcurl, ini adalah yang terdekat dengan yang Anda inginkan (Libcurl memiliki banyak contoh ). Lihatlah fungsi utamanya. Konten html akan disalin ke buffer, setelah koneksi berhasil. Cukup ganti parseHtml dengan fungsi Anda sendiri.
sumber
Anda dapat menggunakan perpustakaan embeddedRest . Ini adalah pustaka header-saja yang ringan. Jadi mudah untuk memasukkannya ke proyek Anda dan itu tidak memerlukan kompilasi karena tidak ada
.cpp
file di dalamnya.Minta contoh dari
readme.md
dari repo:sumber
netdb.h
dll jadi saya ingin bantuan ya#ifdef _WIN32
dan menambahkan kode khusus windows. Lihat di sini - tidak ada banyak perbedaan antara soket unix dan soket windows. Saya melihat dua perbedaan utama: 1) meneleponWSAStartup
dulu dan 2) menggunakanclosesocket
alih-alihclose
Protokol HTTP sangat sederhana, sehingga sangat mudah untuk menulis klien HTTP. Ini satu
https://github.com/pedro-vicente/lib_netsockets
Menggunakan GET HTTP untuk mengambil file dari server web, baik server dan file adalah parameter baris perintah. File jarak jauh disimpan ke salinan lokal.
Penafian: Saya penulis
EDIT: URL yang diedit
sumber
Perhatikan bahwa ini tidak memerlukan libcurl, Windows.h, atau WinSock! Tidak ada kompilasi perpustakaan, tidak ada konfigurasi proyek, dll. Saya memiliki kode ini bekerja di Visual Studio 2017 c ++ pada Windows 10:
Saya baru tahu bagaimana melakukan ini, karena saya ingin skrip akses API sederhana, perpustakaan seperti libcurl menyebabkan saya semua jenis masalah (bahkan ketika saya mengikuti petunjuk ...), dan WinSock terlalu rendah level dan rumit .
Saya tidak begitu yakin tentang semua kode membaca IStream (terutama kondisi sementara - jangan ragu untuk memperbaiki / meningkatkan), tapi hei, itu bekerja , bebas repot! (Masuk akal bagi saya bahwa, karena saya menggunakan panggilan pemblokiran (sinkron) , ini tidak apa-apa, itu
bytesRead
akan selalu menjadi> 0U sampai aliran ( ISequentialStream ?) Selesai dibaca, tetapi siapa yang tahu.)Lihat juga: URL Monikers dan Referensi Protokol Pluggable Asinkron
sumber
Berikut adalah beberapa (relatif) kode C ++ 11 sederhana yang menggunakan libCURL untuk mengunduh konten URL ke
std::vector<char>
:http_download.hh
http_download.cc
sumber
Secara umum saya akan merekomendasikan sesuatu lintas platform seperti cURL, POCO, atau Qt. Namun, ini adalah contoh Windows !:
sumber
Jika Anda mencari pustaka klien HTTP di C ++ yang didukung di banyak platform (Linux, Windows dan Mac) untuk mengonsumsi layanan web Restful. Anda dapat memiliki opsi di bawah ini.
sumber
Meski sedikit terlambat. Anda dapat memilih https://github.com/Taymindis/backcurl .
Hal ini memungkinkan Anda untuk melakukan panggilan http pada pengembangan c ++. Cocok untuk pengembangan game Seluler
sumber
Anda dapat menggunakan ACE untuk melakukannya:
sumber