2017-03-07 2 views
-1

machen habe ich einen Endpunkt REST durch ein App Frühlings-Boot-Java zur Verfügung gestellt, die ich mit einem einfachen Go (go1.8 darwin/amd64) Programm zu schlagen versuchen. Ich habe versucht, es in zwei getrennten Wegen zu treffen:403 Forbidden wenn Golang POST

const (
    LOCAL_BASE   = "http://localhost:11400" 
    ADD_FUNDS_ENDPOINT = "/sub-accounts/%d/add-funds" 
) 

type InputArgumentsJson struct { 
    Amount   float64 `json:"amount"` 
    BufferAmount  float64 `json:"bufferAmount"` 
    FromSubAccountID int  `json:"fromSubAccountId"` 
} 

... 

// set up json body 
inputArguments := &InputArgumentsJson{Amount: 1100, BufferAmount: 0, 
    FromSubAccountID: spendFundId} 
bytes := new(bytes.Buffer) 
json.NewEncoder(bytes).Encode(inputArguments) 

// set up the url to call 
endpoint := fmt.Sprintf(ADD_FUNDS_ENDPOINT, billSetAsideId) 
url := LOCAL_BASE + endpoint 

client := &http.Client{} 

req, err := http.NewRequest("POST", url, bytes) 
if err != nil { 
    fmt.Println("ERROR WHILE BUILDING REQUEST") 
    fmt.Println(err) 
} 

req.Header.Add("Content-Type", "application/json") 
resp, err := client.Do(req) 
if err != nil { 
    fmt.Println("ERROR WHILE MAKING REQUEST") 
    fmt.Println(err) 
} 
fmt.Println(resp) 

und:

resp, err := http.Post(url, "application/json; charset=utf-8", bytes) 
if err != nil { 
    fmt.Println("ERROR WHILE MAKING REQUEST") 
    fmt.Println(err) 
} 
fmt.Println(resp) 

ich einen Ausdruck sehen hinzugefügt, wenn die URL und JSON Körper richtig waren und sie zu sein schien:

fmt.Printf("\nMaking request to %s with:\n %s\n", url, bytes) 

out

gedruckt
Making request to http://localhost:11400/sub-accounts/167/add-funds with: 
{"amount":1100,"bufferAmount":0,"fromSubAccountId":166} 

, aber ich bekomme eine Verbotene, wenn ich es benutze.

kann ich diesen Endpunkt treffen, ohne beide Postman mit fehlschlagen und die folgende Curl-Befehl:

curl -H "Content-Type: application/json" -X POST -d '{"amount":1100,"bufferAmount":0,"fromSubAccountId":166}' http://localhost:11400/sub-accounts/167/add-funds

Hat jemand irgendwelche Gedanken auf, was ich hier fehlt möglicherweise? Um der Intrige noch etwas hinzuzufügen, kann ich erfolgreich einen anderen GET-Endpunkt aus dem Go-Programm treffen.

Vielen Dank im Voraus!

Edited zu zeigen, dass ich die URL und JSON Körper, um die Fehler und die umgebende Logik war ansteckend für die Erstellung von

+0

Versuchen Sie zuerst Ihre Fehler zu fangen, 'bzw., err: = client.Do (erf)', sowohl auf Ihre Anfrage und Antwort. – Elad

+0

Ich fange sie tatsächlich so und habe dann 'if err! = Nil' um es auszudrucken, aber nichts wird gefangen. Ich habe das der Kürze halber weggelassen, weil der Server eindeutig antwortet, aber mit einem 403. –

Antwort

0

Sie zeigen nicht, was bytes ist, aber das ist wahrscheinlich das Problem: beide NewRequest und Post nehmen ein io.Reader und lesen Sie den Körper von diesem Leser. Dieses Lesen kann normalerweise nur einmal vorkommen (denken Sie an einen Stream). Wenn Sie fmt.Printf("%s") der io.Reader dieser Druck den Inhalt verbrauchen (höchstwahrscheinlich durch einen String() -Methode aufgerufen wird) und die tatsächliche Anforderung wird mit einem leeren Körper getan.

Immer den gesamten Code anzeigen. Und versuchen Sie nicht, zweimal von einem io.Reader zu lesen.

+0

Das ist ein guter Gedanke, aber es tut es, ob ich die Bytes drucke oder nicht. Ich habe meinen Code bearbeitet, um alles anzuzeigen. –

0

Ich nehme an, es gibt 2 Go-Anwendungen und läuft auf einem anderen Host, der ein CORS Problem ergibt. Erwägen Sie, die Access-Control-Allow-Origin zu Ihrem Dienst mit dem Host Ihres Clients hinzuzufügen.

w.Header().Set("Access-Control-Allow-Origin", "*")

Sie können * mit dem angegebenen Hostnamen, welche Anwendung Ihr Client läuft ändern.

+0

Der Server ist eigentlich eine Java Spring Boot App.Das Seltsame ist, dass ich das gleiche Ergebnis erhalte, wenn es auf meinem lokalen Host ist oder wenn ich die Spring Boot-App auf AWS deploye. In beiden Fällen erhält die Go-App, die lokal ausgeführt wird, 403, während Curl und Postman den Endpunkt erfolgreich erreichen können, unabhängig davon, von wo aus sie ausgeführt wird. Würde das CORS-Problem auch nicht in GET-Anfragen und POST-Anfragen auftreten? Ich kann erfolgreich ein GET mit meinem Go-Programm machen, nur kein POST. –

+0

Können Sie den Request/Response-Header mit Go und Curl protokollieren? –

+0

Es war kein CORS-Problem, aber Ihre Antwort brachte mich dazu, den Server, auf dem ich das Problem entdeckte, genauer zu untersuchen. Meine Go-App war die ganze Zeit in Ordnung, aber die Java-App war ein bisschen wackelig. –

0

OMG .... Ich habe gerade das Problem. Es stellte sich heraus, dass es scheiterte (wie ich es erwartet hatte), aber es wurde fälschlicherweise als 403 anstatt als 400 zurückgegeben. Ugh ... manchmal, wenn man lange auf etwas starrt, entgehen die offensichtlichen Dinge völlig der Aufmerksamkeit.