2

ヘッダーを変更する必要がある POST リクエストを送信しようとしています。

これが私のコードです:

    import (
      "net/http"
      "net/url"
      "fmt"
    )

    const API_URL = "https://api.site.com/api/"

    func SendOne(str string) {
      v := url.Values{}
      v.Add("source", "12345678")
      v.Add("text", str)

      client := &http.Client{nil, nil, nil}
      req, err := http.NewRequest("POST", API_URL, strings.NewReader(v.Encode()))

      if err != nil {
        fmt.Println(err)
      }

      req.Header.Add("Authorization", "123456")
      res, err := client.Do(req)
      if err != nil {
        fmt.Println(err)
      }
      defer res.Body.Close()
    }

コードが機能しない理由がわかりません。どんな手掛かり?

前もって感謝します。


編集: 承認に OAuth 2.0 を使用していたことを忘れていました。

4

1 に答える 1

3

を使用tcpdumpすると、貼り付けたコードのリクエスト ヘッダーと本文が次のようになっていることがわかります。

POST / HTTP/1.1
Host: example.com
User-Agent: Go 1.1 package http
Content-Length: 45
Authorization: 123456
Accept-Encoding: gzip

source=12345678&text=http%3A%2F%2Fexample.com

上記のコメントで、Content-Typeヘッダーを追加すると機能すると述べています。同じプロセスを実行して、2 つのピア間の通信をダンプすると、次のようになります。

POST / HTTP/1.1
Host: example.com
User-Agent: Go 1.1 package http
Content-Length: 45
Authorization: 123456
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip

source=12345678&text=http%3A%2F%2Fexample.com

Content-Typeこれは、提供されたヘッダーが含まれるようになったことを除いて、以前のペイロードとまったく同じです。したがって、Go アプリケーション自体の動作に関しては、明示的に指示したこと以外に特別なことは何も起きていません。

ヘッダーを追加すると機能する理由は、Content-Type話している実際のサーバーが、提供しているコンテンツ本文がどのようにエンコードされているかを知りたがっているためです。

于 2013-09-11T18:01:41.787 に答える