go语言实现简单ngnix样例

目录

1、代码实现样例:

2、postman调用ngnix,转发:


1、代码实现样例:

package main

import (
	"bytes"
	"encoding/json"
	"io"
	"log"
	"net/http"
	"net/http/httputil"
	"net/url"
)

func main() {
	// 定义反向代理的目标服务器地址
	targetURL, err := url.Parse("http://localhost:8082")
	if err != nil {
		log.Fatalf("Failed to parse target URL: %v", err)
	}

	// 创建反向代理
	proxy := httputil.NewSingleHostReverseProxy(targetURL)

	// 修改请求处理函数
	http.HandleFunc("/login", handler(proxy))
	if err := http.ListenAndServe(":8887", nil); err != nil {
		log.Fatalf("Failed to start proxy server: %v", err)
	}
}

func handler(proxy *httputil.ReverseProxy) http.HandlerFunc {
	return func(w http.ResponseWriter, r *http.Request) {
		log.Printf("Received request: %s %s", r.Method, r.URL.Path)

		// 构造传入参数
		params := map[string]string{
			"username": "user1",
			"password": "password1",
		}
		jsonData, err := json.Marshal(params)
		if err != nil {
			http.Error(w, err.Error(), http.StatusInternalServerError)
			log.Printf("Failed to marshal JSON: %v", err)
			return
		}

		// 发送 POST 请求到目标服务器
		resp, err := http.Post("http://localhost:8082/login", "application/json", bytes.NewBuffer(jsonData))
		if err != nil {
			http.Error(w, err.Error(), http.StatusInternalServerError)
			log.Printf("Failed to send POST request: %v", err)
			return
		}
		defer resp.Body.Close()

		// 复制响应头部
		for key, values := range resp.Header {
			for _, value := range values {
				w.Header().Add(key, value)
			}
		}

		// 将目标服务器的响应内容直接返回给客户端
		w.WriteHeader(resp.StatusCode)
		if _, err := io.Copy(w, resp.Body); err != nil {
			log.Printf("Failed to write response: %v", err)
		}

		log.Printf("Forwarded response: %d", resp.StatusCode)
	}
}

2、postman调用ngnix,转发:

相关推荐
安和昂2 小时前
【iOS】知乎日报第三周总结
ios
键盘敲没电2 小时前
【iOS】知乎日报前三周总结
学习·ios·objective-c·xcode
@东辰7 小时前
【golang-技巧】-自定义k8s-operator-by kubebuilder
开发语言·golang·kubernetes
@东辰8 小时前
【golang-技巧】- 定时任务 - cron
开发语言·golang·cron
B.-9 小时前
Flutter 应用在真机上调试的流程
android·flutter·ios·xcode·android-studio
jerry60915 小时前
7天用Go从零实现分布式缓存GeeCache(改进)(未完待续)
分布式·缓存·golang
杜杜的man15 小时前
【go从零单排】Closing Channels通道关闭、Range over Channels
开发语言·后端·golang
iFlyCai19 小时前
Xcode 16 pod init失败的解决方案
ios·xcode·swift
甘橘籽20 小时前
【RPC】 gRPC、pb基本使用--经验与总结
golang
杜杜的man20 小时前
【go从零单排】HTTP客户端和服务端
开发语言·http·golang