我编写了一个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/