【问题标题】:C Curl 400 Bad Request keyword "on"C Curl 400 错误请求关键字“on”
【发布时间】:2017-05-05 13:23:52
【问题描述】:

我编写了一个使用 cURL 调用 web 服务的 C 程序。我通过使用以下参数硬编码 web 服务的地址来开始我的测试: http://....php?type=adresse&texte=XYZ

它工作得很好,所以我尝试连接下面显示的字段 texte 的变量,但它失败并返回 400 Bad Request。

我们查看了请求的内容,webservice地址前面有一个关键字“on”,不知道是从哪里来的。

开启 http://....php?type=adresse&texte=xyz&indDebut=0&indFin=1&epsg=900913&format=json"

char* mystrcat( char* dest, char* src )
{
    while (*dest) dest++;
    while (*dest++ = *src++);
    return --dest;
}

recherche = "G0A3B0";
pcbak_adresse(recherche);
const char * pcbak_adresse(const char *details)
{
...
char * lien;
const char * fin_lien;

lien = "http://....php?type=adresse&texte=";
fin_lien = "&indDebut=0&indFin=1&epsg=900913&format=json";

/*Concatenation function*/
mystrcat(details, fin_lien);
mystrcat(lien, details);

/* Set CURL parameters */
curl_easy_setopt(curlHandler, CURLOPT_URL, lien);
curl_easy_setopt(curlHandler, CURLOPT_CUSTOMREQUEST, "GET");
curl_easy_setopt(curlHandler, CURLOPT_WRITEFUNCTION, callback_func);
curl_easy_setopt(curlHandler, CURLOPT_WRITEDATA, &str);

res = curl_easy_perform(curlHandler);

/* Check for errors */
if (res != CURLE_OK)
    return curl_easy_strerror(res);
...
}

感谢您的帮助!

【问题讨论】:

    标签: c curl


    【解决方案1】:

    不管mystrcat()是什么,

    mystrcat(lien, details);
    

    错了。

    • 如果它创建一个由两个输入组成的新字符串,它不会在任何地方被捕获。

    • 如果它试图写入lien,这是未定义的行为。因为您无法修改 lien 的字符串文字。

    同样的推理可能适用于details,但您没有发布details 声明和/或定义。

    不要使用strcat() 之类的东西,除非您只想使用一次。

    要连接字符串,请使用类似结构的东西,您可以在其中存储当前字符串的长度、目标数组的大小,当然还有目标数组。然后您可以在需要时调整目标的大小,您不需要每次都找到目标字符串的结尾(strcat() 会这样做),您还具有以下优势控制如何附加到具有大量细节的字符串。

    要实现你想要的,你可以这样做

    char lien[256];
    int length;
    
    length = snprintf(
        lien, 
        sizeof(lien),
        "http://....php?type=adresse&texte=%s&indDebut=0&indFin=1&epsg=900913&format=json", 
        details
    );
    if ((length >= sizeof(lien)) || (length == -1))
        return error_occurred_here();
    

    此外,返回一个静态字符串(这可能是 curl_easy_strerror() 返回的内容),而来自同一函数的一个暂时动态的字符串是糟糕的设计,因为,

    1. 您无法判断是错误还是链接返回的 JSON。
    2. 您需要一些方法来确定它是静态字符串还是函数中生成的字符串,以便free() 它。

    【讨论】:

    • 我添加了一些信息来提高对我的代码的理解。我连接的结果是我期望的一个工作 http 地址,我可以将它粘贴到浏览器中并且它工作正常。感谢您的帮助,我会检查我的代码。
    • @batroc 您的代码的结果是未定义的行为,您可能认为它有效,但不一定。听从我的建议,它会奏效的。
    • 感谢您的帮助!我现在使用 snprintf 并且效果很好。
    猜你喜欢
    • 1970-01-01
    • 2017-03-04
    • 1970-01-01
    • 2014-03-05
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 2022-08-18
    相关资源
    最近更新 更多