используя CURL с Table Fusion из приложения NDK - PullRequest
0 голосов
/ 05 марта 2012

Я пытаюсь получить доступ к службе Google Fusion, используя библиотеку 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 дня в этом,

1 Ответ

0 голосов
/ 06 марта 2012

Несколько вещей, которые нужно попробовать:

  • Удалите опцию POSTFIELDSIZE curl.Лучше всего использовать с двоичными данными .
  • Ваш запрос кодируется в формате urlencoded?Попробуйте URL-кодировку запроса.
  • Попробуйте использовать https вместо http в FT URL.
...