Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk menyelesaikan 'Pengepala telah ditulis. Ingin menulis ganti kod status 200 dengan 400' dalam Gin

Bagaimana untuk menyelesaikan 'Pengepala telah ditulis. Ingin menulis ganti kod status 200 dengan 400' dalam Gin

WBOY
Lepaskan: 2024-02-10 20:39:08
ke hadapan
1031 orang telah melayarinya

如何解决杜松子酒中的“标头已写入。想要用 400 覆盖状态代码 200”

Editor PHP Zimo memperkenalkan anda kepada kaedah untuk menyelesaikan masalah "Pengepala telah ditulis. Ingin menulis ganti kod status 200 dengan 400" masalah dalam Gin. Masalah ini biasanya berlaku apabila menggunakan PHP untuk pembangunan web, dan mungkin menyebabkan halaman web gagal dimuatkan dengan betul. Penyelesaian termasuk menyemak output pendua dalam kod anda, mengosongkan penimbal, menyemak konfigurasi pelayan, dsb. Dengan mengambil langkah yang sesuai, anda boleh menyelesaikan isu ini dengan mudah dan memastikan halaman anda berfungsi dengan baik.

Kandungan soalan

Saya cuba menggunakan rangka kerja Gin untuk mengira laporan secara bebas daripada permintaan HTTP, tetapi saya juga mahu mengembalikannya kepada permintaan jika ia belum ditutup lagi. Coretan kod berikut kadangkala berfungsi dengan baik tetapi kadangkala melemparkan ralat "Pengepala sudah ditulis. Ingin menulis ganti kod status 200 dengan 400". Saya tidak dapat mencari penyelesaian.

// router.go
reportRoute.POST("/query", func(c *gin.Context) {
        reporter.ReportInChan <- c
    }) // Unpublish report by id
Salin selepas log masuk
//reporter
package reporter

import (
    "fmt"
    "github.com/gin-gonic/gin"
)

var (
    ReportInChan = make(chan *gin.Context)
)

func Listener() {
    for {
        select {
        case req := <-ReportInChan:
            queryReports(req)
        }
    }
}

func queryReports(req *gin.Context) {
    type ReqQuery struct {
        QueryID    uint           `json:"query_id"`
        Parameters map[string]any `json:"parameters"`
    }
    type Req struct {
        ReportID uint       `json:"report_id"`
        Queries  []ReqQuery `json:"queries"`
    }

    var reqBody Req
    err := req.BindJSON(&reqBody)
    if err != nil {
        fmt.Println("hata var")
        if ctx := req.Request.Context(); ctx.Done() == nil {
            req.JSON(400, gin.H{"error": "Veriler Yanlış Gönderiliyor. Lütfen Bilgi İşlem Birimiyle İletişime Geçin ", "data": nil})
        }
        return
    }
}
Salin selepas log masuk

Penyelesaian

Pengendali di bawah akan menghantar konteks ke saluran dan kemudian kembali. Sebaik sahaja pengendali kembali, permintaan akan dibatalkan. Pada ketika ini, goroutine penerima mungkin tidak mempunyai peluang untuk menghasilkan apa-apa output sama sekali, tetapi kadangkala ia mungkin menghasilkan apa-apa output. Jika Goroutine yang menerima mula menghasilkan output selepas rangka kerja Gin menulis respons tetapi sebelum konteks dibatalkan, anda akan menerima ralat di atas.

reportRoute.POST("/query", func(c *gin.Context) {
        reporter.ReportInChan <- c
})
Salin selepas log masuk

Apa yang anda perlu lakukan ialah melaksanakan skim tamat masa, jadi jika pengendali permintaan boleh bertindak balas sebelum tamat masa itu, ia menulisnya pada output dan mengembalikannya. Jika tidak, anda membiarkan pengendali permintaan berjalan dan mencari cara lain untuk mengembalikan hasilnya kepada pemanggil, mungkin melalui panggilan API lain:

type reportRequest struct {
    ReportParams
    result chan ReportResult
}

reportRoute.POST("/query", func(c *gin.Context) {
        req:=reportRequest {
              ReportParams: {...},
              result: make(chan ReportResult),
        }
        reporter.ReportInChan <- req
        select {
           case time.After(100*time.Millisecond): 
               // Wait 100 msecs 
           case result<-req.result:
               // Write the result
        }
})
Salin selepas log masuk

Kod di atas akan membuat permintaan laporan daripada konteks permintaan, mencipta saluran pulangan, dan kemudian menghantarnya kepada pemproses laporan. Jika pemproses laporan bertindak balas dalam masa 100 milisaat, keputusan boleh ditulis. Jika tidak, keputusan harus disimpan di tempat lain di mana ia boleh diambil oleh API lain.

Pemproses laporan sepatutnya kelihatan seperti ini:

func (r Reporter) reportProcessor() {
   for request:=range r.ReportInChan {
       result:=processReport(request)
       select {
          case request.result <- result:
              // Wrote the result
          default:
               // Cannot write the result, handler returned
             storeResult(result)
   }
}
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk menyelesaikan 'Pengepala telah ditulis. Ingin menulis ganti kod status 200 dengan 400' dalam Gin. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan