2016-05-01 4 views
1

У меня есть такой код, который делает запрос HTTP Яндексу Перевести API:Curl в (ошибка 400) при выполнении запроса HTTP

const char url[] = "https://translate.yandex.net/api/v1.5/tr.json/translate"; 
const char key[] = "secret.key.here"; 
char buf[4096] = { 0 }; 
char input[1024] = "Hello world. H"; 
snprintf(buf, sizeof(buf), "%s?key=%s&lang=ru&text=\"%s\"", 
     url, key, input); 

struct string response; 
init_string(&response); 

CURL *curl; 
CURLcode res; 
curl = curl_easy_init(); 
if(curl) { 
    curl_easy_setopt(curl, CURLOPT_URL, buf); 
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); 
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); 
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback); 
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response); 
    res = curl_easy_perform(curl); 
    if(res != CURLE_OK) { 
     fprintf(stderr, "curl_easy_perform() failed: %s\n", 
       curl_easy_strerror(res)); 
    } 
    curl_easy_cleanup(curl); 
} 

printf("%s\n", response.data); 

После snprintf исполнения, buf содержит такой URL:

https://translate.yandex.net/api/v1.5/tr.json/translate?key=secret.key.here&lang=ru&text="Hello world. H" 

и после ответа response.data содержит:

<html> 
<head><title>400 Bad Request</title></head> 
<body bgcolor="white"> 
<center><h1>400 Bad Request</h1></center> 
<hr><center>nginx/1.6.2</center> 
</body> 
</html> 

, но если я переназначаю char input[1024] = "Hello world."; (без «H»), после http-запроса я получаю правильный ответ: {"code":200,"lang":"en-ru","text":["\"Здравствуй, мир!\"."]}.

В чем может быть проблема?

+0

Вы пытались отправить другой текст, который не является английским. Веб-сайт может использовать код ответа HTTP 400, чтобы сообщить вам, что вы должны отправить его на английском или не можете его перевести. Так что это не имеет никакого отношения к самому скручиванию. –

+0

@TJohnson 'echo -n" Hello world. T "| ./translate {"code": 200, "lang": "en-ru", "text": ["\" Здравствуй, мир. Т \ ""]} '. Снимок экрана с терминала http://s32.postimg.org/lsber5asl/Screen_Shot_2016_05_01_at_20_30_51.png. Однако, когда я делаю тот же запрос через браузер, я получаю код 200. – 0x1337

ответ

3

Вам необходимо закодировать текст ввода для использования в URL-адресе. Попробуйте это curl function

char *input = curl_easy_escape(curl, "Hello world. H", 0); 

 Смежные вопросы

  • Нет связанных вопросов^_^