2014-12-27 7 views
2

Я пытаюсь отправить аргументы JSON на свой сервер и проанализировать их с помощью json.Decoder. Я прочитал, что вы должны иметь возможность получить параметры запроса из свойства request.Body. Ниже мой код сервера:Golang net/http request Тело всегда пусто

func stepHandler(res http.ResponseWriter, req *http.Request) { 
    var v interface{} 
    err := json.NewDecoder(req.Body).Decode(&v) 
    if err != nil { 
     // handle error 
    } 
    log.Println(v) 
} 

Каждый раз, когда я вижу 2014/12/26 22:49:23 <nil> (Diff метки времени, конечно). Мой стороне клиента AJAX вызов заключается в следующем:

$.ajax({ 
    url: "/step", 
    method: "get", 
    data: { 
    steps: $("#step-size").val(), 
    direction: $("#step-forward").prop("checked") ? 1 : -1, 
    cells: JSON.stringify(painted) 
    }, 
    success: function (data) { 
    painted = data; 
    redraw(); 
    }, 
    error: function (xhr) { 
    console.log(xhr); 
    } 
}); 

Пример URL, что посылается:

http://localhost:5000/?steps=1&direction=1&cells=%5B%7B%22row%22%3A11%2C%22column%22%3A15%7D%2C%7B%22row%22%3A12%2C%22column%22%3A15%7D%5D 

приятнее взгляд на Params:

{ 
    steps: "1", 
    direction: "1", 
    cells: "[{"row":11,"column":15},{"row":12,"column":15}]" 
} 

Я попытался с и GET, и POST-запросы.

Почему мой req.Body не расшифровывается? Если я попытаюсь напечатать req.Body в одиночку, я также вижу nil.

+0

Мне кажется, что 'req.Body' действительно пуст - так почему бы не вызвать' req.ParseForm() ', а вместо этого использовать' req.Form'? Что создавало у вас впечатление, что «Тело» каким-то образом получит материал (параметры запроса), которые, безусловно, ** не ** в теле запроса? –

+0

У меня, казалось, было непонимание того, на что ссылается req.Body. req.Form дает мне карту - есть ли способ автоматически развязать строку запроса в объект? –

+0

@AlexMartelli, я пошел с вашим решением. Если вы создадите ответ, я могу отметить его как разрешение этого вопроса. Спасибо огромное! –

ответ

4

req.Body действительно пуст - так, что бы я это сделал, позвоните по номеру req.ParseForm(), а затем используйте req.Form. Body не получит материал (например, параметры запроса), который определенно не находится в теле запроса.

0

Body запроса отправляется внутри полезной нагрузки - он не является частью URL-адреса.

Вы пытаетесь получить доступ к телу .. когда действительно ваши данные находятся в URL-адресе.

Что вы хотите изменить свой ajax , чтобы быть method: "post" - чтобы данные были отправлены вместе с телом, а не как часть URL. Вы также должны убедиться, что данные действительно отправляются вместе с запросом через ваш браузер по выбору «инструменты разработчика». В качестве альтернативы, если вы действительно хотите, чтобы ваши данные отправлялись вместе как часть URL-адреса, вы должны получить доступ к параметру URL запроса - и вручную разобрать значения в структуре (пакет json не сделает этого для вас IIRC).

+0

Json не будет этого делать, но 'req.ParseForm()' (затем обращаясь к 'req.Form') должен выполнить синтаксический анализ от вашего имени, нет? –

+0

Да, моя точка зрения заключалась в том, что отображение его в структуру будет ручным процессом - в отличие от метода 'Decode' пакета json. –

+0

Я попытался изменить свой метод на POST, и я проверил, что данные отправляются в теле как полезная нагрузка, но я все равно получаю нуль каждый раз, когда пытаюсь декодировать. Однако теперь мое Тело выглядит как '& {0xc208020620 false {0 0} false}'. –

Смежные вопросы