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,转发:

相关推荐
姚不倒4 小时前
Go语言进阶:接口、错误处理与并发编程(goroutine/channel/context)
云原生·golang
AGoodrMe8 小时前
swift基础之async/await
前端·ios
hhb_6188 小时前
Swift核心技术难点与实战案例解析
开发语言·ios·swift
人月神话-Lee9 小时前
【图像处理】饱和度——颜色的浓淡与灰度化
图像处理·人工智能·ios·ai编程·swift
宇明一不急11 小时前
go 链表 (标准库实现)
开发语言·链表·golang
人月神话-Lee12 小时前
【图像处理】卷积原理与卷积核——图像处理的核心引擎
图像处理·深度学习·ios·ai编程·swift
~|Bernard|13 小时前
GO语言中哪些类型是可比较类型的(==和!=)
开发语言·后端·golang
2501_9151063214 小时前
深入解析无源码iOS加固原理与方案,保护应用安全
android·安全·ios·小程序·uni-app·cocoa·iphone
Daniel_Coder15 小时前
iOS Widget 开发-15:Widget 性能优化指南
ios·swift·widget·widgetcenter
比特森林探险记16 小时前
底层数据结构分析 go 语言中的 slice map channel interface
数据结构·golang·哈希算法