stack-labs / questions

任何关于Micro的问题都可以在Issue中创建
27 stars 6 forks source link

go-micro api 中请求后req.body中没有数据 #10

Closed SkyWingZhang closed 4 years ago

SkyWingZhang commented 4 years ago

使用micro api网关--handler=api,在micro new -type=api test/test-api之后产生的文件,并且main中注册consul。handler/test中call方法打印req.body没有任何东西.浏览器执行http://127.0.0.1:8080/test/call?name=zty 深度截图_选择区域_20191113095020 深度截图_选择区域_20191113095258 深度截图_选择区域_20191113095430

SkyWingZhang commented 4 years ago

get,post 同样为空

SkyWingZhang commented 4 years ago

使用命令行curl -H 'Content-Type: application/json' -d '{data:123}' http://******************没有问题

SkyWingZhang commented 4 years ago

使用浏览器地址框get请求和vue中post请求均没有东西 深度截图_选择区域_20191113101756

SkyWingZhang commented 4 years ago

代码地址 https://gitee.com/Sky-Wing/text

SkyWingZhang commented 4 years ago

用postman选中body选项也是没有数据。这样的数据接受方式,还不如来个json的字符串?

nonovv commented 4 years ago

请尝试 axios.post('process/sort-add', data)

需要注意的地方:axios

  1. data类型对应的content-type

    • String: application/x-www-form-urlencoded
    • Object: application/json
  2. content-type 为 application/json 时,需要跨域

    需要注意的地方:micro api

  3. POST 取值方式

    • application/x-www-form-urlencoded , req.Post
    • application/json , req.Body
  4. 使用 cors 插件处理跨域

weisd commented 4 years ago

https://github.com/micro/go-micro/blob/master/api/handler/api/util.go#L37 看源码 ,content-type 不是application/x-www-form-urlencoded的时候,才会把http.request.body数据写到api.request.body里,而且被转成了string, 想传二进制数据的,慎用

SkyWingZhang commented 4 years ago

@weisd 原来这样子,非常感谢.但是不用application/x-www-form-urlencoded的时候怎么弄跨域,大神知道吗?前后端分离后得弄跨域

hb-chen commented 4 years ago

@SkyWingZhang 跨域需要cors,在官方x-gateway的插件里都有cors,可以参考