[Golang]net/http를 사용하여 요청 제목의 속성에 여러 개의 값을 부여할 때의 주의점

14004 단어 Go

개요

net/http 라이브러리로 요청을 보낼 때 내용 유형에 여러 개의 값을 저장하고 요청하고자 합니다.
무슨 일이야?
예를 들어, 컨텐츠 유형에서
  • application/json
  • charset=Shift_JIS
  • 에서 기술한 장면은 다음과 같은 절차를 이용하여 명세표를 작성하여 개념 디자인에서 체량의 부피를 분석하도록 한다.
    content-type=application/json;charset=Shift_JIS`
    
    이것(분호)으로 나눠서 보내주시면 좀 빠져서 소개해드릴게요.

    결론

    content-type=application/json;charset=Shift_JIS
    
    위에서 말한 바와 같이;요청 제목에 구분된 값을 추가하여 보내려면net/http 라이브러리에서 다음과 같이 기술합니다.
    main.go
    ()
    header := http.Header{}
    header.Set("Content-Type", "application/json;charset=Shift_JIS")
    ()
    
    아래와 같이 기술한 상황에서 구상의 값이 되지 않는다.
    main.go
    ()
    header := http.Header{}
    header.Set("Content-Type", "application/json")
    header.Add("Content-Type", "charset=Shift_JIS")
    ()
    

    검증


    클라이언트, 서버의 응용 프로그램을 써서 요청 제목의 내용을 살펴보았다.

    클라이언트


    Golang 버전은 go1.11.2 darwin/amd64main.go
    package main
    
    import (
        "bytes"
        "fmt"
        "net/http"
    
        "github.com/labstack/echo"
    )
    
    func main() {
    
        client := &http.Client{}
    
        header := http.Header{}
        header.Set("Content-Type", "application/json")
        header.Add("Content-Type", "charset=Shift_JIS")  // 今回問題の箇所
    
        req, _ := http.NewRequest(
            echo.POST,
            "http://localhost:3000",
            bytes.NewBufferString("hoge"),
        )
        req.Header = header
    
        client.Do(req)
    }
    
    

    서버


    node 버전은 v9.11.2server.js
    var http = require('http');
    var url = require('url');
    
    var server = http.createServer(function (req, res) {
        try {
            console.log('requested.');
            console.log('method: ' + req.method);
            console.log('url: ' + req.url);
            console.log('query: %j', url.parse(req.url, true).query);
            console.log('user agent: ' + req.headers['user-agent']);
            console.log('header' + JSON.stringify(req.headers));
        }
        catch (err) {
            console.error('unhandled exception has occured.');
            console.error(err);
        }
        finally {
            res.end();
        }
    });
    server.listen(3000, function () {
        console.log('http server is running...press enter key to exit.');
    
        process.stdin.on('data', function (data) {
            if (data.indexOf('\n') !== -1) {
                server.close(function () {
                    console.log('http server closed.');
                    process.exit(0);
                });
            }
        });
    });
    server.on('error', function (err) {
        console.error(err);
        process.exit(1);
    });
    

    검증 프로세스


    서버 응용 프로그램을 시작합니다.
    $ node server.js
    
    클라이언트 응용 프로그램 실행
    $ go run main.go
    

    서버 로그

    $ node server.js
    http server is running...press enter key to exit.
    requested.
    method: POST
    url: /
    query: {}
    user agent: Go-http-client/1.1
    header{"host":"localhost:3000","user-agent":"Go-http-client/1.1","content-length":"4","content-type":"application/json","accept-encoding":"gzip"}
    
    헤더의 content-type,charset=Shift_JIS 없어요...?

    조립 요청 제목 수정 처리


    main.go
    ()
    header := http.Header{}
    header.Set("Content-Type", "application/json;charset=Shift_JIS")
    ()
    

    서버 로그

    http server is running...press enter key to exit.
    requested.
    method: POST
    url: /
    query: {}
    user agent: Go-http-client/1.1
    header{"host":"localhost:3000","user-agent":"Go-http-client/1.1","content-length":"4","content-type":"application/json;charset=Shift_JIS","accept-encoding":"gzip"}
    
    기대했던 대로.
    net/http 라이브러리의 Header.Add은;(분호) 구분자는 조립되지 않은 내용의 유형을 표시합니다.

    참고 문헌

    좋은 웹페이지 즐겨찾기