Λήψη δυαδικών απαντήσεων libcurl σε std::string της C++
Περάστε ένα std::string ως περιβάλλον επιστροφής κλήσης και προσθέστε ρητές μετρήσεις byte κατά τη λήψη δυαδικών δεδομένων με το libcurl.
Ένας διαμεσολαβητής μπορεί να ανακτήσει HTML με επιτυχία και παρόλα αυτά να καταστρέψει μια εικόνα κατά την αντιγραφή της σε buffer της C++. Πριν αλλάξετε το πρωτόκολλο του διαμεσολαβητή, ελέγξτε την επιστροφή κλήσης λήψης και το αντικείμενο που περνάτε ως περιβάλλον της.
CURLOPT_WRITEDATA παρέχει δείκτη στην επιστροφή κλήσης εγγραφής. Χωρίς προσαρμοσμένη επιστροφή κλήσης, ο προεπιλεγμένος συγγραφέας του libcurl περιμένει ένα FILE *. Μια διεύθυνση όπως &response, όπου το response είναι std::string, έχει νόημα μόνο όταν η επιστροφή κλήσης σας μετατρέπει αυτό το περιβάλλον πίσω στον προβλεπόμενο τύπο.
static size_t receive(char* data, size_t size,
size_t count, void* context) {
const size_t bytes = size * count;
auto* body = static_cast<std::string*>(context);
try {
body->append(data, bytes);
} catch (...) {
return 0;
}
return bytes;
}Καταχωρίστε και τα δύο μέρη στη λαβή που χρησιμοποιείται για τη μεταφορά:
std::string response;
curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, receive);
curl_easy_setopt(handle, CURLOPT_WRITEDATA, &response);Η κλήση append χρησιμοποιεί τον αριθμό byte που παραδόθηκε. Τα δεδομένα της επιστροφής κλήσης δεν τερματίζονται με μηδέν και μια εικόνα μπορεί να περιέχει μηδενικά byte· η μέτρηση με strlen θα έχανε μέρος του σώματος. Μια απάντηση μπορεί επίσης να φτάσει μέσα από πολλές κλήσεις διαφορετικού μεγέθους.
Η επιστροφή του αριθμού byte που καταναλώθηκε δέχεται το τμήμα. Η επιστροφή διαφορετικού αριθμού ακυρώνει τη μεταφορά με σφάλμα εγγραφής. Ο φρουρός εξαιρέσεων εμποδίζει μια αποτυχία δέσμευσης να διαφύγει από το όριο της επιστροφής κλήσης C· ο καλών πρέπει ακόμη να ελέγξει το αποτέλεσμα της μεταφοράς πριν θεωρήσει το response πλήρες αρχείο.
Κρατήστε το string ζωντανό μέχρι να ολοκληρωθεί η μεταφορά. Αν μια ασύγχρονη εγγραφή υποδοχής προωθήσει στη συνέχεια το περιεχόμενό του, κρατήστε αυτά τα byte ζωντανά μέχρι να ολοκληρωθεί και εκείνη η εγγραφή. Για μεγάλες απαντήσεις, μια περιορισμένη διάταξη ροής είναι προτιμότερη από τη συσσώρευση ολόκληρου του σώματος.