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

它工作正常,所以我尝试为下面显示的字段texte连接一个变量,但是它失败并返回了400 Bad Request。

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


谢谢你的帮助!

最佳答案

不管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()返回的字符串)和从同一函数临时返回的字符串也是错误的设计,因为,


您无法判断是错误还是链接返回的JSON。
您需要某种方法来确定它是静态字符串还是在函数中生成的字符串,以便free()使用它。

关于c - C Curl 400 Bad Request关键字“on”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43806132/

10-10 21:30
查看更多