গো ব্যবহার করে কীভাবে JSON প্রতিক্রিয়া পরিবেশন করবেন?


95

প্রশ্ন: বর্তমানে আমি আমার প্রতিক্রিয়া প্রিন্ট আউট করছি func Index ভালো fmt.Fprintf(w, string(response)) তবে কীভাবে আমি তাদেরকে JSON সঠিকভাবে অনুরোধে যাতে এটি হয়তো একটি দৃশ্য খায় পাঠাতে পারে?

package main

import (
    "fmt"
    "github.com/julienschmidt/httprouter"
    "net/http"
    "log"
    "encoding/json"
)

type Payload struct {
    Stuff Data
}
type Data struct {
    Fruit Fruits
    Veggies Vegetables
}
type Fruits map[string]int
type Vegetables map[string]int


func Index(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
    response, err := getJsonResponse();
    if err != nil {
        panic(err)
    }
    fmt.Fprintf(w, string(response))
}


func main() {
    router := httprouter.New()
    router.GET("/", Index)
    log.Fatal(http.ListenAndServe(":8080", router))
}

func getJsonResponse()([]byte, error) {
    fruits := make(map[string]int)
    fruits["Apples"] = 25
    fruits["Oranges"] = 10

    vegetables := make(map[string]int)
    vegetables["Carrats"] = 10
    vegetables["Beets"] = 0

    d := Data{fruits, vegetables}
    p := Payload{d}

    return json.MarshalIndent(p, "", "  ")
}

github.com/unrolled/reender এছাড়াও সহায়তা করতে পারে।
এলিথার

উত্তর:


128

আপনি আপনার কন্টেন্ট-টাইপ শিরোলেখ সেট করতে পারেন যাতে ক্লায়েন্টরা জেসন আশা করতে পারে

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

জসন থেকে স্ট্রাক্ট মার্শাল করার আরেকটি উপায় হ'ল ব্যবহার করে একটি এনকোডার তৈরি করা http.ResponseWriter

// get a payload p := Payload{d}
json.NewEncoder(w).Encode(p)

11
w.Header().Set("Content-Type", "application/json")সামগ্রীর ধরণের সেট করার জন্য সঠিক হলেও এর json.NewEncoderপরিবর্তে আমি কোনও টেক্সট / প্লেইন ফলাফল পাই না । অন্য কেউ এই হচ্ছে. @ পুর্বর উত্তরটি প্রত্যাশার মতো কাজ করেছে
জয়বিকাভ

4
যে আঁচড়ের দাগ. আমি যদি ব্যবহার w.WriteHeader(http.StatusOk) করি তবে আমি উপরের ফলাফলটি পেয়েছি।
জয়বিকাভ

4
আমি যদি ব্যবহার করি w.WriteHeader(http.StatusOk)তবে আমি পেয়েছি text/plain; charset=utf-8, যদি আমি স্পষ্টভাবে স্থিতি-কোডটি সেট না করি তবে আমি পেয়েছি applicaton/jsonএবং প্রতিক্রিয়াটির এখনও একটি স্ট্যাটাস কোড 200 রয়েছে
রামন র‌্যাম্বো

4
হুমমম ... এটি এখানে ডক্সের সাথে কি করতে পারে ? Changing the header map after a call to WriteHeader (or Write) has no effect unless the modified headers are trailers.
ড্যান এস্পারজা

4
আমার জন্য w.Header().Set("Content-Type", "application/json")উপরের json.NewEncoder(w).Encode(p)কাজ যুক্ত করা হচ্ছে
আরদী নুসাওয়ান

35

অন্যান্য ব্যবহারকারী মন্তব্য করছেন যে এনকোডিং করার সময় Content-Typeএটিই ছিল plain/text। আপনি Content-Typeপ্রথম সেট করতে হবেw.Header().Set , তারপরে এইচটিটিপি প্রতিক্রিয়া কোড w.WriteHeader

আপনি যদি w.WriteHeaderপ্রথমে কল করেন তবে ফোন w.Header().Setদিলে আপনি পাবেনplain/text

একটি উদাহরণ হ্যান্ডলার এর মত দেখতে পারে;

func SomeHandler(w http.ResponseWriter, r *http.Request) {
    data := SomeStruct{}
    w.Header().Set("Content-Type", "application/json")
    w.WriteHeader(http.StatusCreated)
    json.NewEncoder(w).Encode(data)
}

কীভাবে প্রতিক্রিয়া ফিরিয়ে আনব, যদি আমার প্রোগ্রাম আতঙ্কিত হয়? আমি পুনরুদ্ধার () ব্যবহার করে চেষ্টা করেছি, তারপরে সেগুলি থেকে ফিরে আসছি তবে এটি কার্যকর হয়নি।
অনন্তলিয়ারার

28

আপনি আপনার কাজ করে এমন কিছু করতে পারেন getJsonResponse-

jData, err := json.Marshal(Data)
if err != nil {
    // handle error
}
w.Header().Set("Content-Type", "application/json")
w.Write(jData)

4
এই সংস্করণ সম্পর্কে একটি গুরুত্বপূর্ণ দ্রষ্টব্য হ'ল এটি jDataসম্ভবত একটি অকারণে বাইট স্লাইস ব্যবহার করে । Dataসালিশ আকারের হতে পারে, তথ্য মার্শাল করা উপর নির্ভর করে, তাই এটি একটি তুচ্ছ মেমরির অপচয়কারী হতে পারে। মার্শেলিংয়ের পরে, আমরা মেমরি থেকে ResponseWriterস্ট্রিমে অনুলিপি করি । Json.NewEncoder () ইত্যাদি ব্যবহার করে যে উত্তরটি মার্শাল জেএসওএনকে সরাসরি ResponseWriter(তার প্রবাহে ..) এ লিখতে পারে
জোনো

4
আমার জন্য কাজ! 'ডাব্লু.ব্রাইটহাইডার (http.StatusCreated)' এর আগে বা পরে যুক্ত হওয়ার পরে এই সমস্যার মুখোমুখি হয়েছিল।
darkdefender27

4
আতঙ্কিত হওয়ার পরে আর ফিরে আসার দরকার নেই কারণ এটি আপনার প্রোগ্রামটি থেকে বেরিয়ে আসে
andersfylling lling

কমপক্ষে এই সমাধানটি Encoder.Encode()ফাংশনের পেছনের \ n যুক্ত করে না
জোনাথন মুলার

2

Gobuffalo.io ফ্রেমওয়ার্কে আমি এটি এর মতো কাজ করতে পেরেছি:

// say we are in some resource Show action
// some code is omitted
user := &models.User{}
if c.Request().Header.Get("Content-type") == "application/json" {
    return c.Render(200, r.JSON(user))
} else {
    // Make user available inside the html template
    c.Set("user", user)
    return c.Render(200, r.HTML("users/show.html"))
}

এবং তারপরে যখন আমি সেই সংস্থানটির জন্য জেএসওএন প্রতিক্রিয়া পেতে চাই তখন আমাকে "অ্যাপ্লিকেশন / জসন" এ "বিষয়বস্তুর ধরণ" সেট করতে হবে এবং এটি কাজ করে।

আমি মনে করি একাধিক প্রতিক্রিয়া ধরণের হ্যান্ডেলগুলি করার জন্য রেলগুলির কাছে আরও সুবিধাজনক উপায় আছে, আমি এখনও পর্যন্ত গোফালোতে একই রকম দেখতে পাইনি।


0

আপনি এই প্যাকেজ রেন্ডারারটি ব্যবহার করতে পারেন , আমি এই জাতীয় সমস্যা সমাধানের জন্য লিখেছি, এটি জেএসএন, জেএসএনপি, এক্সএমএল, এইচটিএমএল পরিবেশন করার জন্য একটি মোড়ক

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.