Ngular2中的HttpParamRjQlike?
如何为Ruby API序列化JSON 角度1Ngular2中的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
$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{
序列化(值,前缀+'['+(isObject(值)?索引:“”)+']');
});
}否则如果(isObject(toSerialize)和isDate(toSerialize)){
forEachSorted(toSerialize,(值,键)=>{
连载(
价值
前缀+(顶级?“”:“[”)+键+(顶级?“”:“]),
);
});
}否则{
if(isFunction(toSerialize)){
toSerialize=toSerialize();//tslint:禁用行无参数重新分配
}
零件。推(
encodeUriQuery(前缀)+
'=' +
(toSerialize==null
? ''
:encodeUriQuery(序列化值(toSerialize)),
);
}
}
}
从angular 1.x升级时,我遇到了类似的问题
以下是我的解决方案,它还处理嵌套的JSON对象:
function Json2FormEncoded(json_obj) {
let path = arguments[1] || '';
let s = '', p = '';
for (let i in json_obj) {
p = path == '' ? i : path + '[' + i + ']';
s = s ? s + "&" : s;
if (typeof json_obj[i] == 'object') {
s += Json2FormEncoded(json_obj[i], p);
} else {
s += p + '=' + encodeURIComponent(json_obj[i]);
}
}
return s;
}
希望你会发现它有用
也检查一下
import {
isArray,
forEach,
isObject,
isDate,
isFunction,
isUndefined,
isNumber,
} from 'lodash';
function toJsonReplacer(key, value) {
let val = value;
if (
typeof key === 'string' &&
key.charAt(0) === '$' &&
key.charAt(1) === '$'
) {
val = undefined;
}
return val;
}
function toJson(obj, pretty = undefined) {
if (isUndefined(obj)) return undefined;
if (!isNumber(pretty)) {
pretty = pretty ? 2 : null; // tslint:disable-line no-parameter-reassignment
}
return JSON.stringify(obj, toJsonReplacer, pretty);
}
function serializeValue(v) {
if (isObject(v)) {
return isDate(v) ? v.toISOString() : toJson(v);
}
return v;
}
function forEachSorted(obj, iterator, context = null) {
const keys = Object.keys(obj).sort();
for (let i = 0; i < keys.length; i += 1) {
iterator.call(context, obj[keys[i]], keys[i]);
}
return keys;
}
/**
* This method is intended for encoding *key* or *value* parts of query component. We need a custom
* method because encodeURIComponent is too aggressive and encodes stuff that doesn't have to be
* encoded per http://tools.ietf.org/html/rfc3986:
* query = *( pchar / "/" / "?" )
* pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
* unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
* pct-encoded = "%" HEXDIG HEXDIG
* sub-delims = "!" / "$" / "&" / "'" / "(" / ")"
* / "*" / "+" / "," / ";" / "="
*/
function encodeUriQuery(val, pctEncodeSpaces = undefined) {
return encodeURIComponent(val)
.replace(/%40/gi, '@')
.replace(/%3A/gi, ':')
.replace(/%24/g, '$')
.replace(/%2C/gi, ',')
.replace(/%3B/gi, ';')
.replace(/%20/g, pctEncodeSpaces ? '%20' : '+');
}
export function jQueryLikeParamSerializer(params) {
if (!params) return '';
const parts = [];
serialize(params, '', true);
return parts.join('&');
function serialize(toSerialize, prefix, topLevel = undefined) {
if (isArray(toSerialize)) {
forEach(toSerialize, (value, index) => {
serialize(value, prefix + '[' + (isObject(value) ? index : '') + ']');
});
} else if (isObject(toSerialize) && !isDate(toSerialize)) {
forEachSorted(toSerialize, (value, key) => {
serialize(
value,
prefix + (topLevel ? '' : '[') + key + (topLevel ? '' : ']'),
);
});
} else {
if (isFunction(toSerialize)) {
toSerialize = toSerialize(); // tslint:disable-line no-parameter-reassignment
}
parts.push(
encodeUriQuery(prefix) +
'=' +
(toSerialize == null
? ''
: encodeUriQuery(serializeValue(toSerialize))),
);
}
}
}
function Json2FormEncoded(json_obj) {
let path = arguments[1] || '';
let s = '', p = '';
for (let i in json_obj) {
p = path == '' ? i : path + '[' + i + ']';
s = s ? s + "&" : s;
if (typeof json_obj[i] == 'object') {
s += Json2FormEncoded(json_obj[i], p);
} else {
s += p + '=' + encodeURIComponent(json_obj[i]);
}
}
return s;
}