formatter - json viewer




Go JSON পোস্ট অনুরোধ হ্যান্ডলিং (4)

তাই আমার নিম্নলিখিতগুলি রয়েছে, যা অবিশ্বাস্যভাবে হ্যাকি বলে মনে হচ্ছে, এবং আমি নিজেকে ভাবছি যে গো এর চেয়ে ভাল পরিকল্পিত লাইব্রেরি আছে, তবে আমি JSON ডেটা একটি POST অনুরোধের পরিচালনা করার উদাহরণ খুঁজে পাচ্ছি না। তারা সব ফর্ম পোষ্ট।

এখানে একটি উদাহরণ অনুরোধ: curl -X POST -d "{\"test\": \"that\"}" http://localhost:8082/test

এবং এম্বেড করা লগগুলির সাথে এখানে কোডটি রয়েছে:

package main

import (
    "encoding/json"
    "log"
    "net/http"
)

type test_struct struct {
    Test string
}

func test(rw http.ResponseWriter, req *http.Request) {
    req.ParseForm()
    log.Println(req.Form)
    //LOG: map[{"test": "that"}:[]]
    var t test_struct
    for key, _ := range req.Form {
        log.Println(key)
        //LOG: {"test": "that"}
        err := json.Unmarshal([]byte(key), &t)
        if err != nil {
            log.Println(err.Error())
        }
    }
    log.Println(t.Test)
    //LOG: that
}

func main() {
    http.HandleFunc("/test", test)
    log.Fatal(http.ListenAndServe(":8082", nil))
}

একটি ভাল উপায় আছে, অধিকার আছে? আমি শুধু ভাল অনুশীলন হতে পারে কি খুঁজে পেতে stumped করছি।

(গো গোলাং নামে সার্চ ইঞ্জিনেও পরিচিত, এবং এখানে উল্লেখ করা হয়েছে যাতে অন্যরা এটি খুঁজে পেতে পারে।)


আপনি req.Body থেকে পড়া প্রয়োজন। ParseForm পদ্ধতিটি ParseForm থেকে req.Body এবং তারপরে স্ট্যান্ডার্ড HTTP এনকোডেড ফর্ম্যাটে এটি বিশ্লেষণ করছে। আপনি যা চান তা শরীরটি পড়তে এবং JSON বিন্যাসে এটি বিশদ করতে চান।

এখানে আপনার কোড আপডেট করা হয়।

package main

import (
    "encoding/json"
    "log"
    "net/http"
    "io/ioutil"
)

type test_struct struct {
    Test string
}

func test(rw http.ResponseWriter, req *http.Request) {
    body, err := ioutil.ReadAll(req.Body)
    if err != nil {
        panic(err)
    }
    log.Println(string(body))
    var t test_struct
    err = json.Unmarshal(body, &t)
    if err != nil {
        panic(err)
    }
    log.Println(t.Test)
}

func main() {
    http.HandleFunc("/test", test)
    log.Fatal(http.ListenAndServe(":8082", nil))
}

আমি এই সঠিক সমস্যা সঙ্গে নিজেকে ড্রাইভিং ছিল। আমার জেএসএন মার্শালার ও উম্মারশালার আমার গোস্ট স্ট্রাকচারটি নষ্ট করে নি। তারপর আমি সমাধান খুঁজে পেয়েছিলাম https://eager.io/blog/go-and-json :

"গো এর সমস্ত structs হিসাবে, এটি মনে রাখা গুরুত্বপূর্ণ যে রাজধানীর প্রথম অক্ষরের ক্ষেত্র শুধুমাত্র JSON Marshaller এর মতো বাইরের প্রোগ্রামগুলিতে দৃশ্যমান।"

এর পর, আমার মার্শালার ও উমমারশালার পুরোপুরি কাজ!


json.Decoder json.Unmarshal উপর পছন্দ করা উচিত দুটি কারণ আছে। json.Unmarshal - যে 2013 থেকে সবচেয়ে জনপ্রিয় উত্তর মধ্যে json.Unmarshal হয় না:

  1. ফেব্রুয়ারী 2018, go 1.10 একটি নতুন পদ্ধতি json.Decoder.DisallowUnknownFields() যা json.Decoder.DisallowUnknownFields() অবাঞ্ছিত JSON ইনপুট সনাক্ত উদ্বেগ ঠিকানা
  2. req.Body ইতিমধ্যে একটি io.Reader । তার সম্পূর্ণ সামগ্রী পড়া এবং তারপর JSON সঞ্চালন। স্ট্রিম ছিল, যদি json.Unmarshal সম্পদ বর্জ্য বর্জ্য, অবৈধ JSON একটি 10MB ব্লক বলুন। json.Decoder সাথে অনুরোধ json.Decoder পার্সিং করা json.Decoder , কারণ এটি অবৈধ json.Decoder প্রারম্ভিক পার্স ত্রুটিটি ট্রিগার করবে। রিয়েলটাইম মধ্যে I / O প্রবাহ প্রসেসিং পছন্দসই যেতে-উপায়

খারাপ ব্যবহারকারী ইনপুট সনাক্ত করার বিষয়ে ব্যবহারকারীর কিছু মন্তব্য সম্বোধন করে:

বাধ্যতামূলক ক্ষেত্র, এবং অন্যান্য স্যানিটেশন চেক প্রয়োগ করার চেষ্টা করুন:

d := json.NewDecoder(req.Body)
d.DisallowUnknownFields() // catch unwanted fields

// anonymous struct type: handy for one-time use
t := struct {
    Test *string `json:"test"` // pointer so we can test for field absence
}{}

err := d.Decode(&t)
if err != nil {
    // bad JSON or unrecognized json field
    http.Error(rw, err.Error(), http.StatusBadRequest)
    return
}

if t.Test == nil {
    http.Error(rw, "missing field 'test' from JSON object", http.StatusBadRequest)
    return
}

// optional extra check
if d.More() {
    http.Error(rw, "extraneous data after JSON object", http.StatusBadRequest)
    return
}

// got the input we expected: no more, no less
log.Println(*t.Test)

Playground

সাধারণ আউটপুট:

$ curl -X POST -d "{}" http://localhost:8082/strict_test

expected json field 'test'

$ curl -X POST -d "{\"Test\":\"maybe?\",\"Unwanted\":\"1\"}" http://localhost:8082/strict_test

json: unknown field "Unwanted"

$ curl -X POST -d "{\"Test\":\"oops\"}[email protected]#$%^&*" http://localhost:8082/strict_test

extraneous data after JSON

$ curl -X POST -d "{\"Test\":\"Works\"}" http://localhost:8082/strict_test 

log: 2019/03/07 16:03:13 Works

json.Decoder পরিবর্তে json.Decoder ব্যবহার করুন।

func test(rw http.ResponseWriter, req *http.Request) {
    decoder := json.NewDecoder(req.Body)
    var t test_struct
    err := decoder.Decode(&t)
    if err != nil {
        panic(err)
    }
    log.Println(t.Test)
}




go