zoukankan      html  css  js  c++  java
  • .net core api-ajax 请求 的 数据类型

            项目中一个简单的数据交互,是由前端带上参数向后端请求数据,后端接受数据,并且返回给前端。但是,某些时候在写的过程中会发现,后端并不能接收到前端给的数据,或者返回的数据乱码,甚至在地址正确的情况下请求不到后端的函数或者接口。再者,后段请求完成,前端拿不到数据的情况。遇到这种问题真的很糟心。之所以会产生这种情况主要是由请求的数据类型有关。接下来就这个问题我来发表一下我学习到的内容。

    Ajax:

    前端参数:

    data:要求为Object或String类型的参数,发送到服务器的数据。如果已经不是字符串,将自动转换为字符串格式。get请求中将附加在url后。防止这种自动转换,可以查看  processData选项。对象必须为                  key/value格式,例如{foo1:"bar1",foo2:"bar2"}转换为&foo1=bar1&foo2=bar2。如果是数组,JQuery将自动为不同值对应同一个名称。例如{foo:["bar1","bar2"]}转换为&foo=bar1&foo=bar2。

    contentType:要求为String类型的参数,当发送信息至服务器时,内容编码类型默认为"application/x-www-form-urlencoded"。该默认值适合大多数应用场合。不过,国内大多是application/json; charset=utf-8,              来适应参数中有汉字的问题

    后端参数:

    dataType:要求为String类型的参数,预期服务器返回的数据类型。如果不指定,JQuery将自动根据http包mime信息返回responseXML或responseText,并作为回调函数参数传递。

    请求如下:

              $.ajax({
                        url: "",//默认为当前页地址
                        type: "GET",//请求方式(post或get)默认为get
                        data: {},//发送到服务器的数据
                        dataType: "test",//预期返回类型,如果不指定,JQuery将自动根据http包mime信息返回responseXML或responseText,并作为回调函数参数传递。 
                        contentType:"application/json; charset=utf-8",//发送到服务器的数据的编码类型
                        success: function(res) {
                            console.log(res)
                        },
                        error: function(XMLHttpRequest, textStatus, errorThrown) {
                            console.log("error");
                            console.log(XMLHttpRequest);
                            console.log(textStatus);
                            console.log(errorThrown);
                        }
                    })

    关于ajax的类型节选自:https://www.cnblogs.com/tylerdonet/p/3520862.html


    Server:

    我们在建立一个接口的话,需要建立一个控制器

           这边有MVC控制器和一个API控制器供大家选择,这两个有什么不同呢?

      新建出两个控制器,从直观上看,MVCController就是个普通的Controller,APIController 也类似于一个普通的Controller ,然后细心点会发现APIController 头部多了一个[ApiController][Route("[controller]")],这两个。不过MVCController如果在头部注明[ApiController][Route("[controller]")] 也可以当做API去请求。多说一点[Route("[controller]")]通常按照[Route("[controller]/[action]")]的写法,表明控制器名字和函数名,前面也可以加其他验证。

      那么这两个不就一眼了吗,还有什么区别呢?嗯...接着观察会发现,继承的类也不一样,MVCController继承Controller,APIController 继承ControllerBase。所以说这个两个继承的类不同,其他的就是一种文件。

      Controller和ControllerBase这两个类又有什么不同呢?

      首先F12点进去,很明显的看到

      1、Controller继承与ControllerBase

      

       2、Controller 比 ControllerBase 多了 View 相关支援:View、PartialView、JsonResult、ViewComponent

       3、Controller 比 ControllerBase 多了TempData、ViewData、ViewBag

       所以,如果只是單純使用 Web API 不會使用到 View 相關功能,應該在建立 Controller 時就繼承自 ControllerBase 而非 ControllerActionResult是控制器方法执行后返回的结果类型,控制器方法可以返回一个直接或间接从ActionResult抽象类继承的类型,如果返回的 是非ActionResult类型,控制器将会将结果转换为一个ContentResult类型。默认的ControllerActionInvoker 调用ActionResult.ExecuteResult方法生成应答结果。

    关于Controller 的区别节选自:https://blog.yowko.com/aspdotnet-core-controller-controllerbase/


    交互

      返回字符类型

      当然如果知道字符类型具体的类型可以直接使用string 前端 dataType 为 text 就可以了,但是如果返回是个Model的话前端不知道这个类型这时候需要了解一下ActionResult这个类了。

          JsonResult:

      我们返回一个json格式的数据在ControllerBase里直接使用JsonResult 类型就可以了,前端dataType为json 效果如下:

      web:

      

       server:

      

       web result:

      

      F12进入JonsResult 类可见,它既可以返回一个对象,也可以返回一个字符,非常的NICE

       IActionResult

      在ControllerBase是没有JonsResult 的,如果返回一个json 怎么办呢,这时候就用到IActionResult这个类了

      官方文档是这样子的

       嗯他返回了一个Ok亲测有效



    最后一个问题就是后端接受返回的数据

    字符类型接收

      前端json格式的data

      

      后端一个string或者int根据具体的数据类型就可以接收到,其中数据会自动转换的,但是string类型写个汉字用int接受肯定不行的。

    Model接收

      如果后端直接一个model扔过去,肯定是404.因为前端不知道你这个模型的存在。

      官方使用的是FromBody属性

      

        然后我发现,没用跟以前一样404,我就该用了FromForm找是找到了这个函数,而且所有的[FromQuery]都接收到了数据,需要在每个需要的字段加上[FromQuery]

        这个apiController这个貌似是2.1开始才有的不加ApiController的话,默认是FromForm,加了默认是FromBody

    OVER

    简单分析到这里吧

        

     

    FromBody

  • 相关阅读:
    排列组合之全排列
    Shell脚本学习指南 [ 第一、二章 ] 背景知识、入门
    Scala基础知识[一]
    Hadoop JVM调整解决 MapReduce 作业超时问题
    PL_SQL学习
    Oracle实用操作
    Fernflower 反编译.class文件
    Java命名规范
    Oracle学习笔记1
    JDBC连接MySQL与Oracle
  • 原文地址:https://www.cnblogs.com/hkzw/p/13978721.html
Copyright © 2011-2022 走看看