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

相关推荐
不老刘31 分钟前
LiveKit 本地部署全流程指南(含 HTTPS/WSS)
golang·实时音视频·livekit
未来侦察班3 小时前
一晃13年过去了,苹果的Airdrop依然很坚挺。
macos·ios·苹果vision pro
Tony Bai7 小时前
再见,丑陋的 container/heap!Go 泛型堆 heap/v2 提案解析
开发语言·后端·golang
锐意无限9 小时前
Swift 扩展归纳--- UIView
开发语言·ios·swift
符哥20089 小时前
用Apollo + RxSwift + RxCocoa搭建一套网络请求框架
网络·ios·rxswift
念何架构之路10 小时前
Go进阶之panic
开发语言·后端·golang
先跑起来再说10 小时前
Git 入门到实战:一篇搞懂安装、命令、远程仓库与 IDEA 集成
ide·git·后端·elasticsearch·golang·intellij-idea
Aftery的博客10 小时前
Xcode运行报错:SDK does not contain ‘libarclite‘ at the path
macos·cocoa·xcode
文件夹__iOS14 小时前
AsyncStream 进阶实战:SwiftUI 全局消息流极简实现
ios·swiftui·swift
2501_9160088916 小时前
深入解析iOS机审4.3原理与混淆实战方法
android·java·开发语言·ios·小程序·uni-app·iphone