Ngular2中的HttpParamRjQlike?

Ngular2中的HttpParamRjQlike?,http,post,typescript,angular,ionic2,Http,Post,Typescript,Angular,Ionic2,如何为Ruby API序列化JSON 角度1 $scope.submitForm = function() { var data = {"contato": $scope.contato, "id":$scope.contato.id, "_method":'PUT'}; $http.post( 'http://myApi/contatos/' + $scope.contato.id, **$httpParamSerializerJQ

如何为Ruby API序列化JSON

角度1

$scope.submitForm = function() {       
    var data = {"contato": $scope.contato, "id":$scope.contato.id, "_method":'PUT'};
    $http.post(
        'http://myApi/contatos/' + $scope.contato.id,
        **$httpParamSerializerJQLike(data)**,
        {
            headers: {'Content-Type': 'application/x-www-form-urlencoded'},
            datatype: "JSONP"
        }).then(function successCallback(response) {
            modalContato.show();
            setTimeout(function (){
                modalContato.hide();
                $state.go('contato-detalhe', {"id":$scope.contato.id});
            }, 1500);              

    });
};    
角度2:

insertContato(contato: Contato) {
  let headers = new Headers({
    'Content-Type': 'application/x-www-form-urlencoded'        
  });      
  let options = new RequestOptions({ headers: headers });
  this._http    
    .post(this.urlApi + '/contatos', JSON.stringify(contato), options)      
    .subscribe(data => {
      console.log('Funciona: ' + data.text());
    }, error => {
      console.log('Erro: ' + error.text())
    });           
}
“JSON.stringify(contato)” 它与$httpParamSerializerJQLike(数据)的行为不同。 服务器中的Json已损坏

于2016-04-13 13:25:55-0300发布了127.0.0.1版的“/contatos” ContatosController处理#创建为HTML 参数:{{\“nome\”:\“asd\”,\“email\”:\“asd@asda.com\“,\“telefone\”:\“123\”}”=>nil} 在4ms内完成400个错误请求(ActiveRecord:0.0ms)

正确答案是:

于2016-04-12 17:00:24-0300发布了127.0.0.1版的“/contatos” ContatosController处理#创建为JSON 参数:{“contato”=>{“nome”=>“felipe”,“telefone”=>“5555”} 在278ms内完成200 OK(视图:0.1ms |活动记录:229.4ms)


我想在前言中说,这可能不是处理这个问题的最佳方式,但这是我自己解决问题的方式(Angular 2文档似乎没有提到x-www-form-urlencoded)

因此,如果您的数据设置为

var data = {"contato": $scope.contato, "id":$scope.contato.id, "_method":'PUT'};
你基本上想自己把它转换成一种形式

var encodedData = "contato=" + contato + "&id=" + contato.id + "&_method=PUT";
然后您可以修改您的POST请求,如下所示

this._http    
.post(this.urlApi + '/contatos', encodedData, options)      
.subscribe(data => {
  console.log('Funciona: ' + data.text());
}, error => {
  console.log('Erro: ' + error.text())
});
没有必要对其进行JSON.stringify,因为您不是在传递JSON,而是在传递表单数据


我希望这能有所帮助。

我在http.ts提供程序中编写了一个函数,如下所示---

这样说吧

post('localhost/url',data){
data = this.formatData(data);
}

我有一个类似的问题,我可以解决这个问题:

import { Headers, Http, Response, URLSearchParams, RequestOptions } from '@angular/http';

let headers = new Headers({
     'Content-Type': 'application/x-www-form-urlencoded',
     'Accept': '*/*'});
  let options = new RequestOptions({ headers: headers });
  let body = new URLSearchParams();

  body.set("message", JSON.stringify(m_dataRequest));
  body.set("webService", "authService");

  return this.http
             .post(this.Url, body.toString(), options)
             .toPromise()
             .then(this.extractData)
             .catch(this.handleError);
URLSearchParams规范化了表单和管道的参数,这对我来说很有用。
我希望这能解决您的问题。

只需从中复制相关代码即可

导入{
伊萨雷,
forEach,
isObject,
isDate,
isFunction,
没有定义,
isNumber,
}来自“lodash”;
函数toJsonReplacer(键,值){
设val=value;
如果(
键的类型==='string'&&
key.charAt(0)=='$'&&
key.charAt(1)=='$'
) {
val=未定义;
}
返回val;
}
函数toJson(obj,pretty=undefined){
if(isUndefined(obj))返回undefined;
如果(!isNumber(pretty)){
pretty=pretty?2:null;//tslint:禁用行无参数重新分配
}
返回JSON.stringify(obj、toJsonReplacer、pretty);
}
函数序列化值(v){
if(等标(v)){
返回isDate(v)?v.toISOString():toJson(v);
}
返回v;
}
函数forEachSorted(obj,迭代器,context=null){
const keys=Object.keys(obj.sort();
for(设i=0;i