环境: 服务器:Go 框架:gin ;客户端:flutter dart 请求库dio
截至2020年09月我所使用的请求库 package:http/http.dart 允许使用web形式发送请求。但是开发可能需要移动端网页端区分,造成代码冗杂。
问题: 目前使用Dio库来作为Web请求,使用代码如下:
getCustomerlist(String needrow, String page) async { String url = pool.host + "/getcustomerlist"; print("开始"); Dio dio = Dio(); try { print(url); await dio.post(url).then((value){ var listdata = value.data; print(listdata); }); } on Exception catch (ex) { print("获取客户列表错误:" + ex.toString()); return null; } //} }然后抛出异常:
获取客户列表错误:DioError [DioErrorType.RESPONSE]: XMLHttpRequest error在使用Dio库前也使用了http库来作为Web请求,但也是报同样的错误。查到http的底层,只有一段话,翻译过来意思是:
不好意思,XmlHttpRequest没有相关的错误文档。通过查询,是跨域问题。 https://segmentfault.com/q/1010000020706011 针对go服务器我添加Header信息如下;
func Getcustomerlist(c *gin.Context) { method :=c.Request.Method c.Header("Access-Control-Allow-Origin", "*") c.Header("Access-Control-Allow-Headers", "Content-Type,AccessToken,X-CSRF-Token, Authorization, Token") c.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS") c.Header("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers, Content-Type") c.Header("Access-Control-Allow-Credentials", "true") //放行所有OPTIONS方法 if method == "OPTIONS" { c.AbortWithStatus(http.StatusNoContent) } page := c.DefaultQuery("page","1") needrow := c.DefaultQuery("needrow","20") con := new(sqls.Conninf).Conn() mylist := list.New() rows, err := con.Query(fmt.Sprintf("CALL sp_viewPage('id,name','customer','1=1','Id desc',%s,%s,@page ,@totalcount)",page,needrow)) if err != nil { errstr ,_:= fmt.Println("查询【客户列表】访问【数据库失败】:%s", err) c.JSON(404,gin.H{"message":errstr}) logger.Error(fmt.Println(errstr)) return } for rows.Next() { cust := new(common.Customer) if scanerr := rows.Scan(&cust.ID, &cust.NAME); scanerr != nil { logger.Error(fmt.Println("【客户列表】Scan错误:%s", err)) return } if DATASHOWJSON { jsn, err := json.Marshal(cust) if err != nil { logger.Error(fmt.Println("客户列表转换JSON错误:%s", err)) return } mylist.PushBack(string(jsn)) } else { c.JSON(404, gin.H{"message": "暂时没有结构化STRUCT"}) } } str := "" str = convertList2Json(mylist) //转换List成json c.JSON(200, str) c.Next() }通过测试我其中起到作用的是如下代码
c.Header("Access-Control-Allow-Origin", "*") //c.Header("Access-Control-Allow-Headers", "Content-Type,AccessToken,X-CSRF-Token, Authorization, Token") //c.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS") //c.Header("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers, Content-Type") //c.Header("Access-Control-Allow-Credentials", "true")也就是说添加这一条就可以完成跨域请求 至于后面注释的是什么,我还得再看看····