Отправка POST-запроса локально в C ++ в Windows

У меня есть клиент c ++ и сервер golang на одном компьютере (в Windows 10), и я хочу, чтобы клиент отправлял запросы POST на сервер. Запрос, который я хочу отправить, является / test. Оба проекта компилируются и работают хорошо, но запросы не обрабатываются клиентом, даже если сервер показывает

"HTTP-GA-SERVER: POST Successfully sent"

Вот код C ++:

#include <winsock2.h>
#include "ga-http-post.h"
int sendPostToMushroom(HttpRequestType req, void* metrics)
{
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0) {
std::cout << "WSAStartup failed." << std::endl;
return 1;
}
SOCKET Socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

SOCKADDR_IN SockAddr;
SockAddr.sin_port=htons(8080);
SockAddr.sin_family=AF_INET;
SockAddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);

std::cout << "HTTP-GA: Connecting..." << std::endl;

if (Socket < 0) {
std::cout << "HTTP-GA: Error creating socket: " << WSAGetLastError() << std::endl;
return 1;
}

if(connect(Socket,(SOCKADDR*)(&SockAddr),sizeof(SockAddr)) != 0){
std::cout << "HTTP-GA: Error connecting: " << WSAGetLastError() << std::endl;
return 1;
}
std::cout << "HTTP-GA: Connected to " << inet_ntoa(SockAddr.sin_addr) << std::endl;

char buffer[2048];
strcpy(buffer,"POST /test HTTP/1.1\n");

if (send(Socket,buffer, strlen(buffer),0) != strlen(buffer))
{
std::cout << "HTTP-GA: Error sending:" << WSAGetLastError() << std::endl;
return 1;
}
closesocket(Socket);
WSACleanup();
std::cout << "HTTP-GA: POST Successfully sent" << std::endl;
return 0;
}

И код Голанга:

func (a *Agent) runGaHTTPHandler() {
fmt.Println("HTTP : Init HTTP Server")

http.HandleFunc("/ready", a.handleServerReady)
http.HandleFunc("/unavailable", a.handleServerUnavailable)
http.HandleFunc("/connected", a.handleClientConnected)
http.HandleFunc("/disconnected", a.handleServerUnavailable)
http.HandleFunc("/MetricsCollected", a.handleMetrics)
http.HandleFunc("/test", a.handleTest)

fmt.Println("HTTP : Listen and serve")
log.Fatal(http.ListenAndServe(":8080", nil))
}

func (a *Agent) handleTest(w http.ResponseWriter, r *http.Request) {
fmt.Print("HTTP : Test successful\n")
}

РЕДАКТИРОВАТЬ: C ++ код изменился, все еще не работает

0

Решение

редактировать

В коде клиента попробуйте изменить:
strcpy(buffer,"POST /test HTTP/1.1\n");
в
strcpy(buffer,"POST /test HTTP/1.1\r\nHost: localhost\r\n\r\n");

HTTP / 1.1 требует наличия Host Заголовок HTTP; после заголовков должен быть дополнительный перевод строки (\r\n). Конечно, изменить localhost на фактическое имя хоста, если это необходимо.

[Предыдущий ответ относительно кода сервера Go http]

в handleTest функция, вам нужно написать в http.ResponseWriter w или использовать его WriteHeader а также Write функции. В настоящее время fmt.Print в вашем коде скорее всего печатает строку в терминале, где вы запустили сервер Go, но не отправляете ее клиенту. Попробуйте следующую (упрощенную) версию вашей программы Go:

package main

import (
"fmt""log""net/http")

func main() {
http.HandleFunc("/test", handleTest)

fmt.Println("HTTP : Listen and serve")
log.Fatal(http.ListenAndServe(":8080", nil))
}

func handleTest(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("HTTP : Test successful\n"))
}

Когда вы запустили сервер Go, клиент должен получить ответ, подобный этому, с помощью curl (вы также можете получить к нему доступ через браузер для тестирования):

$ curl http: // localhost: 8080 / test
HTTP: тест пройден успешно

Вы можете увидеть описание ResponseHeader«s Write а также WriteHeader functiosn в документации для пакета net / http: https://golang.org/pkg/net/http/#ResponseWriter

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]