Прокси REST API с использованием golang - PullRequest
0 голосов
/ 12 июня 2018

Я на самом деле изучаю golang и пытаюсь реализовать прокси на API отдыха, который я создал на другом языке

Пока я хочу только запросить мой API golang, извлечь из него фактические параметры путии запросить другой API на его основе.

Я хочу, чтобы результат был "точно" таким же (или, по крайней мере, частью тела), как простой JSON.

ПокаЯ не хочу создавать структуру для своих данных, я просто хочу просто получить и извлечь содержимое.

Вот что у меня есть:

package main

import (
    "fmt"
    "net/http"

    "github.com/gorilla/mux"
)

const API_URL string = "https://my-api-path/"

func setHeaders(w http.ResponseWriter) {
    w.WriteHeader(http.StatusOK)
    w.Header().Set("Content-Type", "application/json")
}

func extractParams(r *http.Request) map[string]string {
    return mux.Vars(r)
}

func getHandler(w http.ResponseWriter, r *http.Request) {
    setHeaders(w)
    params := extractParams(r)

    url := API_URL + params["everything"]
    response, err := http.Get(url)

    if err != nil {
        fmt.Fprint(w, err)
    }

    fmt.Fprint(w, response)

}

func main() {
    router := mux.NewRouter()
    router.HandleFunc("/{everything}", getHandler)
    http.ListenAndServe(":8080", router)
}

Моя проблема

На данный момент я не могу получить информацию JSON из моего другого API.У меня есть только text/plain Content-Type, что странно, поскольку я применяю application/json, и у меня есть только некоторые детали заголовка в теле ответа, что-то вроде:

&{200 OK 200 HTTP/2.0 2 0 map[Allow:[GET, HEAD, OPTIONS] Expect-Ct:[max-age=86400, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"] Server:[cloudflare] Cf-Ray:[some-ray] Date:[Tue, 12 Jun 2018 14:38:57 GMT] Content-Type:[application/json] Set-Cookie:[__cfduid=lolol; expires=Wed, 12-Jun-19 14:38:56 GMT; path=/; domain=some-domain; HttpOnly; Secure] Vary:[Accept-Encoding Cookie] X-Frame-Options:[SAMEORIGIN] X-Xss-Protection:[1; mode=block]] 0xc4201926f0 -1 [] false true map[] 0xc420150800 0xc4200e8370}

У вас есть какие-либо идеи о том, какЯ могу прокси этот запрос (или результат JSON)?

1 Ответ

0 голосов
/ 12 июня 2018

Если заголовок Content-Type не записан в ваш ответ:

Кажется ожидаемым из-за порядка, в котором вы выполняете эти операции:

w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")

См. Здесь:https://golang.org/pkg/net/http/#ResponseWriter

Изменение карты заголовка после вызова метода WriteHeader (или Write) не имеет никакого эффекта, если только измененные заголовки не являются трейлерами.

Попробуйте инвертировать их, чтобы прочитать:

w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusOK)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...