2011-09-08 40 views
0

我可以使用libcurl發送Json字符串嗎?我對這兩個都是新手。任何形式的幫助,將不勝感激。基本上,我想用簡單的libcurl送送一個JSON字符串和接收用Clibcurl中的Json字符串

我的代碼如下:

#include <stdio.h> 
#include <string.h> 
#include <curl/curl.h> 

/* Auxiliary function that waits on the socket. */ 
static int wait_on_socket(curl_socket_t sockfd, int for_recv, long timeout_ms) 
{ 
    struct timeval tv; 
    fd_set infd, outfd, errfd; 
    int res; 

    tv.tv_sec = timeout_ms/1000; 
    tv.tv_usec= (timeout_ms % 1000) * 1000; 

    FD_ZERO(&infd); 
    FD_ZERO(&outfd); 
    FD_ZERO(&errfd); 

    FD_SET(sockfd, &errfd); /* always check for error */ 

    if(for_recv) 
    { 
    FD_SET(sockfd, &infd); 
    } 
    else 
    { 
    FD_SET(sockfd, &outfd); 
    } 

    /* select() returns the number of signalled sockets or -1 */ 
    res = select(sockfd + 1, &infd, &outfd, &errfd, &tv); 
    return res; 
} 

int main(void) 
{ 
    CURL *curl; 
    CURLcode res; 
    /* Minimalistic http request */ 
    const char *request = "reactantsJSON={"O=O":{"N":1}}&productsJSON=["O=O","[O]"]&temperature=2273.15&pressure=101.325"; 
    curl_socket_t sockfd; /* socket */ 
    long sockextr; 
    size_t iolen; 

    curl = curl_easy_init(); 
    if(curl) { 
    curl_easy_setopt(curl, CURLOPT_URL, "http://gibbs.sdsu.edu:8080/axis2/services/GibbsMinimization/solveTP"); 
    /* Do not do the transfer - only connect to host */ 
    curl_easy_setopt(curl, CURLOPT_CONNECT_ONLY, 1L); 
    res = curl_easy_perform(curl); 

    if(CURLE_OK != res) 
    { 
     printf("Error: %s\n", strerror(res)); 
     return 1; 
    } 

    /* Extract the socket from the curl handle - we'll need it for waiting. 
    * Note that this API takes a pointer to a 'long' while we use 
    * curl_socket_t for sockets otherwise. 
    */ 
    res = curl_easy_getinfo(curl, CURLINFO_LASTSOCKET, &sockextr); 

    if(CURLE_OK != res) 
    { 
     printf("Error: %s\n", curl_easy_strerror(res)); 
     return 1; 
    } 

    sockfd = sockextr; 

    /* wait for the socket to become ready for sending */ 
    if(!wait_on_socket(sockfd, 0, 60000L)) 
    { 
     printf("Error: timeout.\n"); 
     return 1; 
    } 

    puts("Sending request."); 
    /* Send the request. Real applications should check the iolen 
    * to see if all the request has been sent */ 
    res = curl_easy_send(curl, request, strlen(request), &iolen); 

    if(CURLE_OK != res) 
    { 
     printf("Error: %s\n", curl_easy_strerror(res)); 
     return 1; 
    } 
    puts("Reading response."); 

    /* read the response */ 
    for(;;) 
    { 
     char buf[1024]; 

     wait_on_socket(sockfd, 1, 60000L); 
     res = curl_easy_recv(curl, buf, 1024, &iolen); 

     if(CURLE_OK != res) 
     break; 

     printf("Received %u bytes.\n", iolen); 
    } 

    /* always cleanup */ 
    curl_easy_cleanup(curl); 
    } 
    return 0; 
} 

我得到的錯誤是,它說了「;」在第40行中缺失,這不過是json字符串,即使我是一個「;」在那條線上。它看起來像發送json字符串我需要做的事情,我不知道。編譯代碼時是否需要指定一些標誌?

+0

到目前爲止您嘗試了什麼?它是如何失敗的? –

+0

你想把它發送給* httpd? FTP服務器? telnet會話? –

+0

@Pete:我想發送到http – user537670

回答

3
const char *request = "reactantsJSON={"O=O":{"N":1}}&productsJSON=["O=O","[O]"]&temperature=2273.15&pressure=101.325"; 

您需要在您的字符串文字中轉義"

const char *request = "reactantsJSON={\"O=O\":{\"N\":1}}&productsJSON=[\"O=O\",\"[O]\"]&temperature=2273.15&pressure=101.325";