2016-04-12 10 views
-3

Ich habe mit POST und GET in C# gearbeitet, aber der Versuch, es in C zu implementieren, wird für mich etwas verwirrend.C Programmierung - Http POST Anfrage mit Parametern

Ich habe erfolgreich mit einer Steckdose mit 8443-Port auf meinem lokalen Rechner verbunden.

Jetzt versuche ich eine POST-Anfrage mit 3 Parametern an die 127.0.0.1:8443/xxxx/xxxAPI URL zu senden.

Normalerweise in GET kann ich die Abfrage Zeichenfolgen in meiner URL selbst anhängen ... aber in POST brauche ich einen Nachrichtentext, ContentHeader, Type etc und dann meine Parameter.

Ich habe einen benutzerdefinierten TCP-Code in C, der mir hilft, eine Verbindung zum Server herzustellen. Nach erfolgreicher Verbindung versuche ich so etwas wie den folgenden Pseudocode zu machen ... Aber offensichtlich weiß ich nicht, was ich tue ... Kann mir jemand helfen?

  sprintf(szBuff, "POST /xxxx/xxxxxxAPI HTTP/1.1\r\n"); 
      sprintf(contentHeader, "Content-Length: %d\r\n", 20); 

      send(iSock, szBuff, strlen(szBuff), 0); 
      send(iSock, "Accept: */*\r\n", 15, 0); 
      send(iSock, "User-Agent: Mozilla/4.0\r\n", 27, 0); 
      send(iSock, contentHeader, strlen(contentHeader), 0); 
      send(iSock, "Accept-Language: en-us\r\n", 26, 0); 
      send(iSock, "Accept-Encoding: gzip, deflate\r\n", 34, 0); 
      send(iSock, "Host: ", 6, 0); 
      send(iSock, "hostname", 8, 0); 
      send(iSock, "\r\n", 4, 0); 
      send(iSock, "Content-Type: application/x-www-form-urlencoded\r\n", 50, 0); 
      send(iSock, "\r\n", 4, 0); 
      send(iSock, "\r\n", 4, 0); 
      send(iSock, parameters, strlen(parameters), 0); 
      send(iSock, "\r\n", 4, 0); 
      /*if (write(iSock, szBuff, sizeof(szBuff)) == -1) 
       LogToFile("Error while request being sent to the server");*/ 
+0

‚do {...} while (0); '??? –

+0

Entschuldigung, das ist Teil der Fehlerüberprüfung, die ich nicht im Code zeige ... Ich habe es entfernt, um Verwirrung zu vermeiden – Philo

+1

Diese hartkodierten Längen sind eine schlechte Idee. Und einige von ihnen sind falsch. '" \ r \ n "' ist eine Zeichenkette aus 2 Zeichen, nicht 4. Außerdem sendest du 3 aufeinanderfolgende '\ r \ n' Paare nach dem Inhaltstyp, was 1 zu viel ist. Sind Sie sicher, dass Sie nicht nur 'fdopen' verwenden möchten? –

Antwort

3

Ich schlage vor, Bibliotheken wie libcurl etwas zu verwenden

0

Versuchen Sie, etwas mehr wie folgt aus:

int sendStr(int iSock, const char *szStr) 
{ 
    int ret; 
    int len = strlen(szStr); 
    while (len > 0) { 
     ret = send(iSock, szStr, len, 0); 
     if (ret == -1) { 
      //LogToFile("Error while request being sent to the server"); 
      return -1; 
     } 
     szStr += ret; 
     len -= ret; 
    } 
    return 0; 
} 

char szContentHeader[32]; 
sprintf(szContentHeader, "Content-Length: %d\r\n", strlen(parameters)); 

sendStr(iSock, "POST /xxxx/xxxxxxAPI HTTP/1.1\r\n"); 
sendStr(iSock, "Host: hostname:8443\r\n"); 
sendStr(iSock, "User-Agent: Mozilla/4.0\r\n"); 
sendStr(iSock, "Accept: */*\r\n"); 
sendStr(iSock, "Accept-Language: en-us\r\n"); 
sendStr(iSock, "Accept-Encoding: gzip, deflate\r\n"); 
sendStr(iSock, szContentHeader); 
sendStr(iSock, "Content-Type: application/x-www-form-urlencoded\r\n"); 
sendStr(iSock, "\r\n"); 
sendStr(iSock, parameters); 

Dann können Sie die Antwort des Servers lesen. Was an sich kann ziemlich beteiligt sein (und außerhalb des Umfangs dieser Frage) in Abhängigkeit von wie die Antwort gesendet wird. Siehe RFC 2616 Section 4.4 Message Length Einzelheiten über das, und beziehen sich auf meine Antwort auf die folgende Frage für die Art von Pseudo-Code müssten Sie implementieren:

When is an HTTP response finished?