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

相关推荐
岁忧3 小时前
GoLang五种字符串拼接方式详解
开发语言·爬虫·golang
游戏开发爱好者84 小时前
iOS 开发者的安全加固工具,从源码到成品 IPA 的多层防护体系实践
android·安全·ios·小程序·uni-app·cocoa·iphone
编程小Y5 小时前
Redux在iOS中的使用
ios
游戏开发爱好者86 小时前
Charles 抓不到包怎么办?从 HTTPS 代理排错到底层数据流补抓的完整解决方案
网络协议·http·ios·小程序·https·uni-app·iphone
1024小神7 小时前
在 Swift 中,self. 的使用遵循明确的规则
开发语言·ios·swift
Swift社区7 小时前
Swift 类型系统升级:当协议遇上不可拷贝的类型
开发语言·ios·swift
雨中散步撒哈拉7 小时前
18、做中学 | 初升高 | 考场一 | 面向过程-家庭收支记账软件
开发语言·后端·golang
robin591110 小时前
容器-PUSH镜像卡住问题排查
容器·golang·kubernetes
风生u10 小时前
Go中的反射
golang·反射