2012-03-05 30 views
0

我試圖通過使用curl庫,從這個NDK應用程序訪問谷歌的融合服務是我的代碼:使用curl與表融合從NDK應用

jstring Java_com_AnalyticToolC_AnalyticToolActivity_JNISendData(JNIEnv* env,jobject entryObject,jstring webpageJStr,jstring loginHeaderJStr,jstring insertJStr) 
{ 
    pageInfo_t page; 
    CURL *curl; 
    CURLcode res; 
    char *buffer; 

    const jbyte *webpage; 
    webpage = (*env)->GetStringUTFChars(env, webpageJStr, NULL); 

    if (webpage == NULL) { 
     return NULL; /* OutOfMemoryError already thrown */ 
    } 

    page.data = (char *)malloc(16 * 1024); 
    page.len = 0; 
    if (page.data) 
    memset(page.data, 32, 16 * 1024); 

    buffer = (char *)malloc(1024); 

    curl = curl_easy_init(); 
    if(curl) { 
     curl_easy_setopt(curl, CURLOPT_URL, webpage); 
     curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, HTTPData); 
     curl_easy_setopt(curl, CURLOPT_WRITEDATA, &page); 

     curl_easy_setopt(curl, CURLOPT_POST, 1); 
     const jbyte *insert; 
     insert = (*env)->GetStringUTFChars(env, insertJStr, NULL); 
     //post field to request 
     curl_easy_setopt(curl, CURLOPT_POSTFIELDS, insert); 
     curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, sizeof(insert)); 

     struct curl_slist *headers = NULL; 
     const jbyte *auth; 
     auth = (*env)->GetStringUTFChars(env, loginHJStr, NULL); 
     headers = curl_slist_append(headers, auth); 
     // attach headers to this request 
     curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); 

     res = curl_easy_perform(curl); 
     /* always cleanup */ 
     curl_easy_cleanup(curl); 
     (*env)->ReleaseStringUTFChars(env, webpageJStr, webpage); 
     if(res == 0) { 
      if (buffer) { 
       page.data[page.len < 256 ? page.len : 256] = '\0'; 
       sprintf(buffer, "pagedata(%d): %s. done.\n", page.len, page.data); 
       return (*env)->NewStringUTF(env, buffer); 
      } 
     } 
     sprintf(buffer, "Result %d", res); 
     return (*env)->NewStringUTF(env, buffer); 
    } 
    else 
    { 
     return (*env)->NewStringUTF(env, "Unable to init cURL"); 
    } 
} 

typedef struct pageInfo_t { 
    char *data; 
    int len; 
}; 

static size_t HTTPData(void *buffer, size_t size, size_t nmemb, void *userData) { 
    int len = size * nmemb; 
    pageInfo_t *page = (pageInfo_t *)userData; 
    if (buffer && page->data && (page->len + len < (16 * 1024))) { 
     memcpy(&page->data[page->len], buffer, len); 
     page->len += len; 
    } 
    return len; 
} 

這些都是Android應用程序傳遞給字符串的值方法

1-webpageJStr="http://www.google.com/fusiontables/api/query"
2-loginHeaderJStr="Authorization: GoogleLogin Auth=dddnjb...." //我有我的用戶
3-insertJStr="sql=INSERT INTO 2887732 (App_Name,Device_Model,Execute_Date) VALUES ('test','test','02/02/2011')"

中的令牌值問題是,我總是得到響應串

的「SQL paramater不能爲空錯誤400」

誰能幫助我,什麼是錯我的請求頭內容或可能是我有問題, CURL選項我在這2天內被卡住了。

回答

0

有幾件事情嘗試:

  • 刪除POSTFIELDSIZE捲曲選項。這最好與binary data一起使用。
  • 您的查詢爲urlencoded嗎?嘗試使用網址編碼查詢。
  • 嘗試在FT URL中使用https而不是http。
+0

非常感謝kathryn,POSTFIELDSIZE curl選項的問題,我只是評論一行,它的工作原理 – Serngawy 2012-03-06 15:00:38