2016-04-12 10 views
-3

私はPOSTとGETでC#で作業しましたが、Cで実装しようとするとちょっと混乱しています。Cプログラミング - Http POSTでパラメータを要求する

ローカルマシンの8443ポートを使用してソケットに正常に接続しました。

今、私は127.0.0.1:8443/xxxx/xxxAPI URLに3つのパラメータでPOSTリクエストを送信しようとしています。

通常、GETでは自分のURLにクエリ文字列を付けることができますが、POSTではメッセージ本文、contentHeader、Typeなどが必要です。

私はサーバーに接続するのに役立つカスタムTCPコードをCに用意しています。成功した接続の後、私は次の擬似コードのようなことをしようとしています....しかし、明らかに私は何をしているのかわかりません...誰も私を導くことができますか?

  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

「(0)ながら{...}行います。 '??? –

+0

残念ですが、コードに表示されていないことを確認するエラーの一部です...混乱を避けるために削除しました – Philo

+1

これらのハードコードされた長さは悪い考えです。そしてそれらのいくつかは間違っています。 '' \ r \ n "'は2文字の文字列であり、4ではなく文字列です。また、Content-Typeの後に3つの連続した '\ r \ n 'ペアを送信します。 'fdopen'を使いたいだけではないですか? –

答えて

3

は、私はより多くのこのような何かを試してみてくださいlibcurl

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); 

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; 
} 

はその後、サーバーの応答を読み取ることができます。 に応じて、それ自体がかなり関与することができます(この質問の範囲外)。応答が送信されます。その詳細についてはRFC 2616 Section 4.4 Message Lengthを参照してください、そして、あなたが実装する必要があるだろう疑似コードの種類について、次の質問のために私の答えを参照してください。

When is an HTTP response finished?

関連する問題