一、使用curl post,若post的数据大于1024,curl不会自己发起post请求,而分为2步:
第一步:发送一个请求,header中包含一个Expect:100-continue,询问server是否愿意接受数据
第二步:接收到server返回的100-continue回应之后才post数据
这样会导致请求有延迟
解决方法:将header中Expect设置为空
二、CURLOPT_CUSTOMREQUEST
设置DELETE方法
三、上传&下载文件
size_t WriteFunc(void *ptr, size_t size, size_t nmemb, FILE *stream) { return fwrite(ptr, size, nmemb, stream); } static int Debug(CURL *curl, curl_infotype ty, char *p, size_t len, void *puser) { std::string *psDebug = (std::string *)puser; switch (ty) { case CURLINFO_HEADER_IN: case CURLINFO_HEADER_OUT: case CURLINFO_DATA_IN: case CURLINFO_DATA_OUT: psDebug->append(p, len); break; default: break; } return 0; }
上传文件:
// HTTP POST multipart/form-data 请求数据 struct curl_httppost *pHttpMultiPost = NULL; struct curl_httppost *pTemp = NULL; curl_formadd(&pHttpMultiPost, &pTemp, CURLFORM_COPYNAME, "data_file", CURLFORM_FILE, “uploadfile”, CURLFORM_END);
下载文件:
FILE *outfile; CURL *curl = curl_easy_init(); if (!curl) { printf("init curl fail\n"); return -1; } if(!CFG->m_sUrlProxy.empty()) { curl_easy_setopt(curl, CURLOPT_PROXY, CFG->m_sUrlProxy.c_str()); //proxy } outfile = fopen(sDataFile.c_str(), "wb"); curl_easy_setopt(curl, CURLOPT_URL, sJssUrl.c_str()); curl_easy_setopt(curl, CURLOPT_WRITEDATA, outfile); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteFunc); curl_easy_setopt(curl, CURLOPT_NOPROGRESS, false); curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); std::string sDebug; curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, Debug); curl_easy_setopt(curl, CURLOPT_DEBUGDATA, &sDebug); curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); CURLcode res = curl_easy_perform(curl); /* Check for errors */ if (res != CURLE_OK) { printf("res != CURLE_OK, sDebug[%s]\n", sDebug.c_str()); curl_easy_cleanup(curl); return -1; } long http_code = 200; curl_easy_getinfo (curl, CURLINFO_RESPONSE_CODE, &http_code); if(http_code != 200) { printf("http_code = %d\n", http_code); curl_easy_cleanup(curl); return -1; } int iRet = 0; do { /* Check for errors */ if (res != CURLE_OK) { printf("res != CURLE_OK\n"); iRet = -1; break; } long http_code = 200; curl_easy_getinfo (curl, CURLINFO_RESPONSE_CODE, &http_code); if(http_code != 200) { if(http_code != 201) { printf("http_code = %d\n", http_code); iRet = -1; break; } } }while(0); /* always cleanup */ curl_easy_cleanup(curl);