2014-11-19 2 views
-1

Я здесь возникают трудности в получении значения ответа после выполнения HTTP POST, используя скручивание в C., как я могу получить значение ответа, используя скручивание в C

я получил ответ, как показано ниже:

POST /xxxx HTTP/1.1 
Host: xxxx.net 
Accept: */* 
Content-Length: 271 
Content-Type: application/x-www-form-urlencoded 

HTTP/1.1 200 OK 
Content-Type: text/xml 
Date: Tue, 18 Nov 2014 13:49:31 GMT 
Server: Null 
Content-Length: 106 
Connection: keep-alive 

<?xml version="1.0" encoding="UTF-8"?> 
<rsp stat="fail"> 
<err code="100" msg="Invalid_Parameter"/> 
</rsp> 

Как получить значение ответа xml с помощью curl?

Я использую curl_easy_perform для обработки сообщения http.

Я прочитал справочный документ, но я могу найти только CURLINFO_HTTP_CODE и CURLINFO_CONTENT_TYPE. Но это не связано с значением ответа xml. Какой параметр curl_easy_getinfo, который я должен использовать?

ответ

2

Данные ответа записываются в STDOUT по умолчанию. Чтобы изменить это, используйте curl_easy_setopt(CURLOPT_WRITEFUNCTION) и curl_easy_setopt(CURLOPT_WRITEDATA), чтобы использовать пользовательскую функцию записи и буфер памяти. Существует пример этого метода можно найти в документации:

http://curl.haxx.se/libcurl/c/getinmemory.html

/*************************************************************************** 
*         _ _ ____ _ 
* Project      ___| | | | _ \| | 
*       /__| | | | |_) | | 
*       | (__| |_| | _ <| |___ 
*        \___|\___/|_| \_\_____| 
* 
* Copyright (C) 1998 - 2013, Daniel Stenberg, <[email protected]>, et al. 
* 
* This software is licensed as described in the file COPYING, which 
* you should have received as part of this distribution. The terms 
* are also available at http://curl.haxx.se/docs/copyright.html. 
* 
* You may opt to use, copy, modify, merge, publish, distribute and/or sell 
* copies of the Software, and permit persons to whom the Software is 
* furnished to do so, under the terms of the COPYING file. 
* 
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 
* KIND, either express or implied. 
* 
***************************************************************************/ 
/* Example source code to show how the callback function can be used to 
* download data into a chunk of memory instead of storing it in a file. 
*/ 

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#include <curl/curl.h> 

struct MemoryStruct { 
    char *memory; 
    size_t size; 
}; 


static size_t 
WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp) 
{ 
    size_t realsize = size * nmemb; 
    struct MemoryStruct *mem = (struct MemoryStruct *)userp; 

    mem->memory = realloc(mem->memory, mem->size + realsize + 1); 
    if(mem->memory == NULL) { 
    /* out of memory! */ 
    printf("not enough memory (realloc returned NULL)\n"); 
    return 0; 
    } 

    memcpy(&(mem->memory[mem->size]), contents, realsize); 
    mem->size += realsize; 
    mem->memory[mem->size] = 0; 

    return realsize; 
} 


int main(void) 
{ 
    CURL *curl_handle; 
    CURLcode res; 

    struct MemoryStruct chunk; 

    chunk.memory = malloc(1); /* will be grown as needed by the realloc above */ 
    chunk.size = 0; /* no data at this point */ 

    curl_global_init(CURL_GLOBAL_ALL); 

    /* init the curl session */ 
    curl_handle = curl_easy_init(); 

    /* specify URL to get */ 
    curl_easy_setopt(curl_handle, CURLOPT_URL, "http://www.example.com/"); 

    /* send all data to this function */ 
    curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback); 

    /* we pass our 'chunk' struct to the callback function */ 
    curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)&chunk); 

    /* some servers don't like requests that are made without a user-agent 
    field, so we provide one */ 
    curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, "libcurl-agent/1.0"); 

    /* get it! */ 
    res = curl_easy_perform(curl_handle); 

    /* check for errors */ 
    if(res != CURLE_OK) { 
    fprintf(stderr, "curl_easy_perform() failed: %s\n", 
      curl_easy_strerror(res)); 
    } 
    else { 
    /* 
    * Now, our chunk.memory points to a memory block that is chunk.size 
    * bytes big and contains the remote file. 
    * 
    * Do something nice with it! 
    */ 

    printf("%lu bytes retrieved\n", (long)chunk.size); 
    } 

    /* cleanup curl stuff */ 
    curl_easy_cleanup(curl_handle); 

    if(chunk.memory) 
    free(chunk.memory); 

    /* we're done with libcurl, so clean it up */ 
    curl_global_cleanup(); 

    return 0; 
} 
1

Согласно http://curl.haxx.se/libcurl/c/CURLOPT_WRITEDATA.html, вы также можете написать тело ответа в файл через FILE* по

FILE *fp = fopen("resp.xml", "wb"); 
curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, fp); 
curl_easy_perform(curl_handle); 
fclose(fp); 
curl_easy_cleanup(curl_handle); 
Смежные вопросы