C Curl 400 Bad Request关键字“on”

时间:2017-05-05 13:23:52

标签: c curl

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

它工作正常,所以我试图连接一个变量for field texte如下所示,但它失败并返回400 Bad Request。

我们检查了请求的内容,并且在网络服务地址前面有一个关键字“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);
...
}

感谢您的帮助!

1 个答案:

答案 0 :(得分: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()生成的字符串。