1. <strong id="d2o2m"><address id="d2o2m"><rp id="d2o2m"></rp></address></strong>

    <acronym id="d2o2m"></acronym>
    <acronym id="d2o2m"><sup id="d2o2m"><nav id="d2o2m"></nav></sup></acronym>
    <optgroup id="d2o2m"><em id="d2o2m"><del id="d2o2m"></del></em></optgroup>
    <ol id="d2o2m"></ol>
  2. contentType: “application/json” 的理解和應用

    時間:2022-09-14 20:14:05 類型:JS/JQUERY
    字號:    
    $.ajax({
      type: httpMethod,
      cache:false,
      async:false,
      contentType: "application/json; charset=utf-8",
      dataType: "json",//返回值類型
      url: path+url,
      data:jsonData,
      success: function(data){
        var resultData = '返回碼='+data.status+',響應結果='+data.message+',耗時='+data.tcost;
        layer.msg(resultData,{icon: 1});
      },
      error : function(xhr, ts, et) {
        layer.msg('服務調用失敗!', {icon: 2});
      }
    });

    contentType: 發送信息至服務器時內容編碼類型,簡單說告訴服務器請求類型的數據。

    默認值: "application/x-www-form-urlencoded"。

    dataType:告訴服務器,我要想什么類型的數據,除了常見的json、XML,還可以指定 html、jsonp、script或者text


    不使用contentType: “application/json”則data可以是對象。

    $.ajax({
    url: actionurl,
    type: "POST",
    datType: "JSON",
    data: { id: nodeId },
    async: false,
    success: function () {}
    });

      使用contentType: “application/json”則data只能是json字符串。

    $.ajax({
    url: actionurl,
    type: "POST",
    datType: "JSON",
    contentType: "application/json"
    data: "{'id': " + nodeId +"}",
    async: false,
    success: function () {}
    });

      1. ajax發送json數據時設置contentType: "application/json”和不設置時到底有什么區別?

      contentType: "application/json”,首先明確一點,這也是一種文本類型(和text/json一樣),表示json格式的字符串,如果ajax中設置為該類型,則發送的json對象必須要使用JSON.stringify進行序列化成字符串才能和設定的這個類型匹配。同時,對應的后端如果使用了Spring,接收時需要使用@RequestBody來注解,這樣才能將發送過來的json字符串解析綁定到對應的 pojo 屬性上。另外,需注意一點,json字符串在書寫時名稱部分需要加上“”雙引號,以免一些json解析器無法識別。

      如ajax 請求時不設置任何contentType,默認將使用contentType: "application/json”application/x-www-form-urlencoded,這種格式的特點就是,name/value 成為一組,

      每組之間用 & 聯接,而 name與value 則是使用 = 連接。如: www.baidu.com/query?user=username&pass=password 這是get請求, 而 post 請求則是使用請求體,參數不在 url 中,在請求體中的參數表現形式也是: user=username&pass=password的形式。使用這種contentType時,對于簡單的json對象類型,如:{“a”:1,"b":2,"c":3} 這種,將也會被轉成user=username&pass=password 這種形式發送到服務端。而服務端接收時就按照正常從from表單中接收參數那樣接收即可,不需設置@RequestBody之類的注解。但對于復雜的json 結構數據,這種方式處理起來就相對要困難,服務端解析時也難以解析,所以,就有了application/json 這種類型,這是一種數據格式的申明,明確告訴服務端是什么格式的數據,服務端只需要根據這種格式的特點來解析數據即可。

      總結:

      1).ajax 如果發送的是json字符串,服務端接收時必須要使用@RequestBody注解。始終記住,json字符串,"application/json”,@RequestBody 這三者之間是一一對應的,要有都有,要沒有都沒有。

      2).如果發送的是json對象,contentType不能設置為"application/json”,需使用默認的類型(application/x-www-form-urlencoded,為什么呢?這種類型最后還是會把json對象類型的參數轉為user=username&pass=password這種形式后再發送,需要明白一點:這種轉換時只能識別json對象類型,不能識別json字符串類型)。

      2.application/x-www-form-urlencoded 和 application/json 兩種類型的數據在后端如何接收并解析?

      application/x-www-form-urlencoded 這種類型的參數提交方式有get和post兩種,這兩種方式的區別是前者把編碼后的user=username&pass=password這種形式的參數放在url上進行提交,后者是放在請求報文的請求體部分進行發送,只是發送數據時數據放的位置不一樣。服務端收到 user=username&pass=password 這種形式的參數后,原生的Servlet使用request.getParameter(“user”)的這種形式即可獲取參數,spring mvc 中 框架可自動根據參數名進行匹配,即表單元素的name屬性和接收參數的名稱一樣時即可自動匹配,如果不一樣,還可以使用@RequestParam的方式匹配。

      application/json 字符串數據原生的Servlet中可以使用request.getParameterMap()來獲取,但需注意,這種只能獲取Get方式傳入的數據。post傳入的需要使用輸入流的方式來讀取。在spring mvc中通過@RequestBody來解析并綁定json字符串參數到方法入參。


    黄片基地 <