Rumah  >  Artikel  >  hujung hadapan web  >  Kaedah untuk menyelesaikan masalah bahawa latar belakang SpringMVC tidak dapat menerima nilai parameter selepas permintaan pos sudut_AngularJS

Kaedah untuk menyelesaikan masalah bahawa latar belakang SpringMVC tidak dapat menerima nilai parameter selepas permintaan pos sudut_AngularJS

WBOY
WBOYasal
2016-05-16 15:26:401608semak imbas

Ini ialah kaedah untuk pengawal SpringMVC latar belakang saya menerima parameter isform dan hanya taip nilainya:

@RequestMapping(method = RequestMethod.POST)
  @ResponseBody
  public Map<String, Object> save(
      @RequestParam(value = "isform", required = false) String isform) {
    System.out.println("isform value: " + isform);
    return null;
 
  }

Halaman hadapan menghantar permintaan pos untuk menyerahkan borang


Didapati bahawa nilai tidak diperoleh di latar belakang

Penyelesaian pertama yang saya fikirkan kemudian ialah menambah badan permintaan pada parameter kaedah pengawal untuk menerima parameter json

@RequestMapping(method = RequestMethod.POST)
  @ResponseBody
  public Map<String, Object> save(
      @RequestParam(value = "isform", required = false) @RequestBody String isform) {
    System.out.println("isform value: " + isform);
    return null;
 
  }
Tetapi hasil nilai isform masih batal,

Kemudian saya membandingkan parameter untuk menerima permintaan pos dalam projek sebelumnya, dan mendapati fenomena menarik,

Berikut ialah pengepala permintaan lalai Angular:

$httpProvider.defaults.headers.post: (header lalai untuk permintaan POST)

Jenis Kandungan: application/json

$httpProvider.defaults.headers.put(pengepala lalai untuk permintaan PUT)

Jenis Kandungan: application/json

Siaran dan put Angular adalah kedua-dua aplikasi/json,

"Content-Type" permintaan siaran jquery menjadi lalai kepada "application/x-www-form-urlencoded", jadi saya menukar Content-Type lalai bagi sudut,


app.config(function($httpProvider) {
  $httpProvider.defaults.headers.put['Content-Type'] = 'application/x-www-form-urlencoded';
  $httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
 
});
Badan permintaan seterusnya menjadi seperti ini, tetapi nilai isform masih tidak diperoleh kemudian,

Setelah lama menyemak,

menemui sebabnya di blog warga asing:
Secara lalai, jQuery menghantar data menggunakan Content-Type: x-www-form-urlencoded dan siri foo=bar&baz=moe yang biasa, bagaimanapun, menghantar data menggunakan Content-Type: application/json dan {. "foo": "bar", "baz": "moe" } Siri JSON
Diterjemah oleh saya sendiri:

Secara lalai, jQuery menghantar data menggunakan Content-Type: x-www-form-urlencoded dan urutan yang serupa dengan "foo=bar&baz=moe", walau bagaimanapun AngularJS, menghantar data menggunakan Content-Type: application/json dan { " foo": "bar", "baz": "moe" } jujukan json sedemikian.

Jadi selepas menetapkan Content-Type kepada x-www-form-urlencodedand, anda masih perlu menukar format jujukan,

Berikut adalah penyelesaian akhir yang saya telah uji sendiri selepas berlatih dengan orang asing:


app.config(function($httpProvider) {
  $httpProvider.defaults.headers.put['Content-Type'] = 'application/x-www-form-urlencoded';
  $httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
 
  // Override $http service's default transformRequest
  $httpProvider.defaults.transformRequest = [function(data) {
    /**
     * The workhorse; converts an object to x-www-form-urlencoded serialization.
     * @param {Object} obj
     * @return {String}
     */
    var param = function(obj) {
      var query = '';
      var name, value, fullSubName, subName, subValue, innerObj, i;
 
      for (name in obj) {
        value = obj[name];
 
        if (value instanceof Array) {
          for (i = 0; i < value.length; ++i) {
            subValue = value[i];
            fullSubName = name + '[' + i + ']';
            innerObj = {};
            innerObj[fullSubName] = subValue;
            query += param(innerObj) + '&';
          }
        } else if (value instanceof Object) {
          for (subName in value) {
            subValue = value[subName];
            fullSubName = name + '[' + subName + ']';
            innerObj = {};
            innerObj[fullSubName] = subValue;
            query += param(innerObj) + '&';
          }
        } else if (value !== undefined && value !== null) {
          query += encodeURIComponent(name) + '='
              + encodeURIComponent(value) + '&';
        }
      }
 
      return query.length &#63; query.substr(0, query.length - 1) : query;
    };
 
    return angular.isObject(data) && String(data) !== '[object File]'
        &#63; param(data)
        : data;
  }];
});
Tambah kod di atas dalam modul sudut dan mari lihat kesannya:


Saya mendapati bahawa gaya permintaan siaran adalah konsisten dengan gaya permintaan siaran jquery Adakah ini benar? ! !

Lihat pada status penerimaan parameter di latar belakang,

isform kini boleh menerima parameter seperti biasa, dan anda sudah selesai!

Perkara di atas ialah penyelesaian untuk parameter penerimaan latar belakang permintaan pos sudut menjadi batal, saya harap ia akan membantu pembelajaran semua orang.

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn