2016-12-12 4 views
0

私は、実行可能ファイルが.NETや他のライブラリに依存しないように小さくする必要があるため、Cを使用してPOSTリクエストを作成しようとしています。この行でCでマルチパートjsonを使用してPOSTを適切にフォーマットする

void MakePostReq1(
    const char* verb, 
    const char* hostname, 
    int port, 
    const char* resource, 
    const char* opt_urlencoded, 
    string& response) 
{ 
    WSADATA wsaData; 
    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) 
    { 
     cout << "WSAStartup failed.\n"; 
     exit(1); 
    } 

    SOCKET Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 

    struct hostent *host; 
    host = gethostbyname(hostname); 

    SOCKADDR_IN SockAddr; 
    SockAddr.sin_port = htons(port); 
    SockAddr.sin_family = AF_INET; 
    SockAddr.sin_addr.s_addr = *((unsigned long*)host->h_addr); 

    cout << "Connecting...\n"; 

    if (connect(Socket, (SOCKADDR*)(&SockAddr), sizeof(SockAddr)) != 0) 
    { 
     cout << "Could not connect"; 
     exit(1); 
    } 
    cout << "Connected.\n"; 

    string json1 = ""; 
    json1.append("------------------------e661208454117a87"); 
    json1.append("\r\n"); 
    json1.append("Content-Disposition: form-data; name=\"jsonObject\"\r\n"); 
    json1.append("Content-Type: application/json\r\n"); 
    json1.append("\r\n"); 
    json1.append("{ jsonObject: \"This is a jsonObject\" }"); 
    json1.append("\r\n"); 
    json1.append("\r\n"); 

    string json2 = ""; 
    json2.append("------------------------e661208454117a87"); 
    json2.append("\r\n"); 
    json2.append("Content-Disposition: form-data; name=\"jsonEventObject\"\r\n"); 
    json2.append("Content-Type: application/json\r\n"); 
    json2.append("\r\n"); 
    json2.append("{ jsonEventObject: \"This is a jsonEventObject\" }"); 
    json2.append("\r\n"); 
    json2.append("\r\n"); 

    string trailer = ""; 
    trailer.append("------------------------e661208454117a87"); 
    trailer.append("\r\n"); 


    // Build request 
    string req = "POST"; // GET | POST 
    req.append(" "); 
    req.append(resource); 
    req.append(" HTTP/1.1\r\n"); 
    req.append("Host: "); 
    req.append(hostname); 
    req.append(":"); 
    req.append(to_string(port)); 
    req.append("\r\n"); 

    req.append("Cache-Control: no-cache\r\n"); 
    req.append("Content-length: "); 
    char size[5]; 
    sprintf(size, "%d", json1.size() + json2.size() + trailer.size()); 
    //sprintf(size, "%d", 319); 
    req.append(size); 
    req.append("\r\n"); 
    req.append("Content-Type: multipart/form-data; boundary=\"------------------------e661208454117a87\"\r\n\r\n"); 

    // add json strings 
    req.append(json1); 
    req.append(json2); 
    req.append(trailer); 

    cout << endl; 

    cout << "Request size: " << req.size() << endl; 
    cout << "Request " << endl << req << endl; 

    send(Socket, req.c_str(), req.size(), 0); 

    closesocket(Socket); 
    WSACleanup(); 
} 
+0

あなたはC++ではなく、 'string&response'と' cout << "接続... \ n"ともにそれを肯定します。 –

+0

JSONライブラリを使用する方が自分で試してみるのは簡単ではないでしょうか? .NETだけを使用する方が効果的ではないと確信していますか?コード、応答時間、開発にかかった時間の長さを測定しましたか? –

答えて

0

:以下のコードを実行すると

、サーバが期待されるJSON文字列の両方にNULL値を取得します

req.append("Content-Type: multipart/form-data; boundary=\"------------------------e661208454117a87\"\r\n\r\n"); 

境界から引用符を削除します。

req.append("Content-Type: multipart/form-data; boundary=------------------------e661208454117a87\r\n\r\n"); 

引用符は境界の一部として解釈されるため、データの境界は以下は認識されません。

+0

Steeve、ありがとう。それとトレーラーの " - "が欠けているなどのいくつかの問題が、これがうまくいかない理由でした。 – BlueRiver

関連する問題