كيف يمكنني استخدام وظيفة .Read في الذهاب؟

StackOverflow https://stackoverflow.com/questions/1721212

  •  19-09-2019
  •  | 
  •  

سؤال

محاولة استخدام حزمة HTTP GO، لا أستطيع العمل بناء جملة .Read. وبعد ما يلي الذي يميزه هنا هو الشيء الوحيد الذي يجب أن أتركه، على الرغم من أنني جربت عدة أشياء أخرى تم رفضها من قبل المحول البرمجي.

package main
import "fmt";
import "http";
import "os";

func main () {
    kinopiko_flair := "http://stackoverflow.com/users/flair/181548.json";
    response, _, error := http.Get (kinopiko_flair);
    if (error != nil) {
        // I want to print out the error too.
        fmt.Printf ("Error getting %s\n", kinopiko_flair);
        os.Exit (1);
    }
    fmt.Printf ("Status is %s\n", response.Status);
    var nr int;
    var buf []byte;
    nr, error = response.Body.Read (buf); // HERE
    if (error != nil) {
        // I want to print out the error too.
        fmt.Printf ("Error reading response.\n");
        os.Exit (1);
    }
    response.Body.Close ();
    fmt.Printf ("Got %d bytes\n", nr);
    fmt.Printf ("Got '%s'\n", buf);
}

عنوان URL على ما يرام، منذ wget يحصل على ما يرام، ولكن عندما أقوم بتشغيل هذا buf هي مجرد سلسلة فارغة و nr هو دائما صفر. ما الذي يجب علي فعله للحصول على البيانات من responseب رفض التحويل البرمجي .ReadAll وأشياء أخرى حاولت.

يبدو الناتج مثل هذا:

الحالة هو 200 موافق حصلت 0 بايت حصلت ''
هل كانت مفيدة؟

المحلول

حاول إعطاء شريحة BUF الحجم، على سبيل المثال

 buf := make([]byte,128);

يقرأ القارئ حتى لين () من المخزن المؤقت الذي قدمته.

من io.go.

// Reader is the interface that wraps the basic Read method.
//
// Read reads up to len(p) bytes into p.  It returns the number of bytes
// read (0 <= n <= len(p)) and any error encountered.
// Even if Read returns n < len(p),
// it may use all of p as scratch space during the call.
// If some data is available but not len(p) bytes, Read conventionally
// returns what is available rather than block waiting for more.
//
// At the end of the input stream, Read returns 0, os.EOF.
// Read may return a non-zero number of bytes with a non-nil err.
// In particular, a Read that exhausts the input may return n > 0, os.EOF.

نصائح أخرى

محاولة تكييف مثال القط من البرنامج التعليمي:

fmt.Printf ("Status is %s\n", response.Status);
var nr int;

const NBUF = 512;
var buf [NBUF]byte;

for {
    switch nr, _ := response.Body.Read(&buf); true {
    case nr < 0:
        os.Exit(1);
    case nr == 0:  // EOF
        return;
    case nr > 0:
        if nw, _ := os.Stdout.Write(buf[0:nr]); nw != nr {
            fmt.Printf("error\n");
        }
    }
}

انتاج:

$ ./8.out 
Status is 200 OK
{"id":181548,"gravatarHtml":"\u003cimg src=\"http://www.gravatar.com/avatar/f4a286fa31d1359ee92113823a70a738?s=50&amp;d=identicon&amp;r=PG\" height=\"50\" width=\"50\" alt=\"\"\u003e","profileUrl":"http://stackoverflow.com/users/181548/kinopiko","displayName":"Kinopiko","reputation":"4,674","badgeHtml":"\u003cspan title=\"1 gold badge\"\u003e\u003cspan class=\"badge1\"\u003e&#9679;\u003c/span\u003e\u003cspan class=\"badgecount\"\u003e1\u003c/span\u003e\u003c/span\u003e\u003cspan title=\"5 silver badges\"\u003e\u003cspan class=\"badge2\"\u003e&#9679;\u003c/span\u003e\u003cspan class=\"badgecount\"\u003e5\u003c/span\u003e\u003c/span\u003e\u003cspan title=\"21 bronze badges\"\u003e\u003cspan class=\"badge3\"\u003e&#9679;\u003c/span\u003e\u003cspan class=\"badgecount\"\u003e21\u003c/span\u003e\u003c/span\u003e"}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top