Вызов службы REST с помощью c, подключение через GSM-модем — HTTP/ 1.1 505

#java #c #rest #tomcat #microcontroller

#java #c #rest #tomcat #микроконтроллер

Вопрос:

У меня есть веб-служба REST, которая следует за Spring MVC и развернута с помощью Tomcat-7.0.50. Теперь я хочу вызвать эту службу через встроенный код в устройстве micro controller. GSM-модем размещен вместе с устройством для установления подключения через GPRS.

Вот пример кода на языке Си, используемого для вызова службы REST, развернутой на сервере tomcat.

 char* connect_GPRS(void)
{
int cnt=0;

printf("connecting GPRS");
send_command("ATr");
send_command("AT CIPCLOSEr");
send_command("AT CIPSHUTr");
send_command("AT CIPCSGP=1,"dialoguomlab"r");
send_command("AT CGATT=1r");
send_command("AT CIPMODE=0r");

send_command("AT CIPSTART="TCP","10.8.155.16","8080"r"); // connect TCP
_delay_ms(1000);
send_command("AT CIPSENDr");
while ((strchr(modem_buf,'>')==NULL)amp;amp;(cnt<60)) //wait
{_delay_ms(100); cnt  ; }
clr_buf();  

// send web request to the webserver
fprintf(amp;modem,"POST /MyService/addnums HTTP/1.1rn
Host: 10.8.155.16:8080rn
Content-Type: text/htmlrn
Content-length:6rnrn
    10,100
    %c",26);

while(modem_buf[0]==0);  // wait for any data to come
_delay_ms(5000);
printf(modem_buf);
send_command("AT CIPCLOSEr");

_delay_ms(5000);
printf(modem_buf);   // check if anything in the buffer

return modem_buf;
}
 

Веб-служба размещена по URL-адресу http://10.8.155.16:8080/MyService
(ip 10.8.155.16 является только образцом, а не фактическим, мы можем подключить сервер tomcat)

Вот код службы REST.

 @RequestMapping(value = "/addnums", method = RequestMethod.POST, headers = "Accept=text/html")
public @ResponseBody
String addNumbers(@RequestBody String request) {
    try{

    System.out.println("just enter to addnums.... "   request);

    int sum = 0;
    List<String> values = Arrays.asList(request.split(","));
    for (String s : values) {
        sum = sum   Integer.parseInt(s);
    }
    String sumAsString = Integer.toString(sum);
    System.out.println("going to send the response");
    return sumAsString;
    }catch(Exception e){
        System.out.println("Exception occured while processing..." e.getMessage());
        return "Error";
    }
}
 

Но при вызове для этого мы получаем ошибку

 HTTP/1.1 505 HTTP Version Not Supported Server: Apache-Coyote/1.1 Date: Fri, 27 Jun 2014 04:45:27 GMT Connection: close
 

Пожалуйста, помогите мне определить корневой курс.

Комментарии:

1. что находится в журналах сервера?

2. @guido Я не смог ничего найти в журналах сервера tomcat.

3. Посмотрите на журнал доступа, он покажет запрос, полученный tomcat

4. @guido Я не смог найти ничего с 505 в журнале доступа, поскольку я запускал сервер через eclipse, поскольку мы вносим частые изменения (искал файлы в eclipse, но не нашел) Мы отслеживали запрос через wireshark, и в нем говорится, что POST / MyService / addnums HTTP / 1.1 Продолжение или трафик, отличный от HTTP

5. я могу только догадываться, что это какой-то непечатаемый символ / пробел в первой строке, из-за которого tomcat не нравится запрос. или это может быть связано с сохранением работоспособности; это первый запрос или есть другие, не показанные в коде c?

Ответ №1:

Мы смогли найти ответ на мой собственный вопрос и опубликовать, поскольку это может помочь кому-то другому.

Мы смогли перехватить запрос через отдельную программу TCP-сервера, и во время отладки строки запроса мы увидели, что устройство добавляет еще один r перед каждым n . тогда строка имеет r r n для всех таких случаев. это стало причиной того, что программа не работала. поэтому, когда измените строку так, как это, удалив r, проблема была решена.

     // send web request to the webserver
    fprintf(amp;modem,"POST /MyService/addnums HTTP/1.1n
    Host: 10.8.155.16:8080n
    Content-Type: text/htmln
    Content-length:6nn
    10,100
    %c",26);