libcurl:http响应状态代码始终为NULL?

时间:2019-01-17 10:03:24

标签: c http curl libcurl

我正在使用libcurl 7.29.0。

当服务器运行时,我所有的测试用例都能正常工作,但是当服务器无法访问时,我收到了CURLE_HTTP_RETURNED_ERROR错误。

在这种情况下,我总是遇到CURLE_COULDNT_CONNECT卷曲错误,HTTP响应代码为0

根据我的要求,我需要HTTP响应代码。请提出一些解决方案,谢谢。

下面附有我用来发布数据的API。

int http_curl_post_response(char *url, char *post_data, char *response,
                            long int *responseCode) {
    CURL *ps_curl;
    CURLcode curl_status = CURLE_OK;
    struct curl_slist *headers = NULL; /* http headers to send with request */

    /* get a curl handle */
    ps_curl = curl_easy_init();
    if (ps_curl) {
        /* set content type */
        headers = curl_slist_append(headers, "Accept: application/json");
        headers = curl_slist_append(headers, "Content-Type: application/json");
        headers = curl_slist_append(headers, "charsets: utf-8");

        /* This is to intialize respone from curl */
        http_curl_respone ps_response;

        curl_easy_setopt(ps_curl, CURLOPT_URL, url);

        curl_easy_setopt(ps_curl, CURLOPT_HTTPHEADER, headers);

        curl_easy_setopt(ps_curl, CURLOPT_POSTFIELDS, post_data);

        curl_easy_setopt(ps_curl, CURLOPT_POSTFIELDSIZE, -1L);

        curl_easy_setopt(ps_curl, CURLOPT_FOLLOWLOCATION, 1L);

        /* This is to read response from curl */
        curl_easy_setopt(ps_curl, CURLOPT_WRITEFUNCTION, write_response_json);

        init_response(&ps_response);
        if (ps_response.pi1_response == NULL) {
            i4_curl_status = MEM_ALLOC_ERROR;
            goto HTTP_CURL_ERROR;
        }

        curl_easy_setopt(ps_curl, CURLOPT_WRITEDATA, &ps_response);

        curl_easy_setopt(ps_curl, CURLOPT_FAILONERROR, 1L);

        /* Perform the request, i4_curl_status will get the return code */
        curl_status = curl_easy_perform(ps_curl);
        if (curl_status != CURLE_OK) {
            if (curl_status == CURLE_HTTP_RETURNED_ERROR) {
                curl_easy_getinfo(ps_curl, CURLINFO_RESPONSE_CODE,
                                  responseCode);
                /* always cleanup */
                curl_easy_cleanup(ps_curl);
            }
            goto HTTP_CURL_ERROR;
        } else {
            memcpy(response, ps_response.pi1_response, ps_response.s_len);
            response[ps_response.s_len] = '\0';
        }

        /* always cleanup */
        curl_easy_cleanup(ps_curl);
        /* free headers */
        curl_slist_free_all(headers);

    HTTP_MEM_ERROR:
        if (ps_response.pi1_response) free(ps_response.pi1_response);
    } else {
        curl_status = CURLE_FAILED_INIT;
    }

HTTP_CURL_ERROR:

    return curl_status;
}

1 个答案:

答案 0 :(得分:2)

  

...但是当服务器不可访问时,我收到CURLE_HTTP_RETURNED_ERROR错误。   在这种情况下,我总是收到CURLE_COULDNT_CONNECT curl错误,并且HTTP响应代码为0。

如果服务器无法访问且连接失败,则检查响应代码甚至都没有意义。 response code是HTTP响应的属性。它记录在HTTP服务器发送的HTTP响应(status line)的一部分中,以响应libcurl代表您发送的HTTP请求。如果没有连接,则服务器未收到您的请求,也没有任何回应!

  

根据我的要求,我需要HTTP响应代码。

如果没有连接,则没有响应-因此也没有响应代码。

在这种情况下,您可以将 local responseCode变量设置为-1来指示连接失败:

*responseCode = -1;