Ajaxリクエスト送信は成功しましたがsuccessメソッドには入りません

3486 ワード

  • 状況説明:ajax送信に成功し、バックグラウンドでもリクエストに成功し、jsonデータを返し、chromeリスニングリクエストでも応答のjsonデータを見ることができるが、successメソッドに入らず、errorメソッドに走った.
  • フロントエンド:
    $.ajax({
     type : "get",
     data : {'dbId':node.dbId,'viewId':node.id,'date':new Date()},
     url : "${ctp}/ViewOperate/ShowViewSql",
     dataType : "json",
     success : function(data){
          console.log(data);
          layer.alert(data,{
              skin: 'layui-layer-molv'
          });
     }
     error : function(data){
          layer.alert("   error  ",{
              skin: 'layui-layer-molv'
          });
     }
    });
    
  • バックエンド:
    @RequestMapping(value="/ShowViewSql",method=RequestMethod.GET)
    @ResponseBody
    public String showCreateViewSql(@RequestParam(value="dbId",required=false)Integer dbId,
          @RequestParam(value="viewId",required=false)Integer viewId) {
    
     return "abc";
    }
    
  • 理由:バックグラウンドから返されるjsonデータが純粋なStringタイプのオブジェクトである場合、フロントエンドdataType属性がjsonに設定されると、このStringオブジェクトから変換されるjsonデータフォーマットが標準的なjsonフォーマットではないと考えられるので、error対応の方法を実行します.
  • 解決:バックエンドは変更する必要はなく、フロントエンドajax要求におけるdataType属性をtextに設定するだけで
  • となる.
    $.ajax({
         type : "get",
         data : {'dbId':node.dbId,'viewId':node.id,'date':new Date()},
         url : "${ctp}/ViewOperate/ShowViewSql",
         dataType : "text",
         success : function(data){
              console.log(data);
              layer.alert(data,{
                  skin: 'layui-layer-molv'
              });
         }
         error : function(data){
              layer.alert("   error  ",{
                  skin: 'layui-layer-molv'
              });
         }
    });
    
  • 特殊な場合:バックエンドから戻ってくるjson数字が「1」、「2」、「22」、「232123」、「-1」、「232123.44」の数字文字列のような場合、フロントエンドdataType属性がjsonに設定されている場合でも、successメソッドに正常にアクセスできますが、原因は不明です.