FormData将boolean作为字符串发送到服务器

时间:2015-11-10 07:58:36

标签: javascript angularjs api multipartform-data form-data

我有以下输入,即切换返回true,false

@Path("cars")
@Produces(MediaType.APPLICATION_JSON)
public class CarAPIService {
    //...
    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    @Path("save")
    public Car save(Car instanceToSave) {
        //Implement method
    }
}

当我像这样发送

<input id="{{event.id}}" ng-model="event.is_active" type="checkbox" value="true" class="block__input" ng-class="{'input__toggle--active' :  event.is_active}">

在服务器中,我收到false和true作为字符串&#39; true&#39;,&#39; false&#39;

如何解决这个问题?

8 个答案:

答案 0 :(得分:2)

您可以发送每个&#34;已检查的项目&#34;作为一个字符串(结果为true)并且不发送&#34;未选中的项目&#34; (在服务器端默认为false。)例如:

客户端(js / jquery)

var fd = new FormData();
var foo = $('[name="foo"]').prop('checked');
var bar = $('[name="bar"]').prop('checked');
var is_active = $('[name="is_active"]').prop('checked');

if (foo) fd.append('foo',foo);
if (bar) fd.append('bar', bar);
if (is_active) fd.append('is_active', is_active') 

服务器端(php / laravel)

$foobar = new FooBar();
$foobar->foo = $request->foo ? true : false;
$foobar->bar = $request->bar ? true : false;
$foobar->is_active = $request->is_active ? true : false;

上面的三元语句将在php中返回false。

答案 1 :(得分:1)

FormData将始终以字符串形式发送。解决问题的一种方法是使用JSON。只需在客户端使用JSON.stringify对您的值进行编码即可。在服务器端,您只需解码值。

<强>客户机侧

var fd = new FormData;
var data = {
    name: 'john doe',
    active: true,
    count: 42
};
var prop;
for(prop in data){
    fd.append(prop, JSON.stringify(data[prop]));
}

// if you want to upload files, too
fd.append('file', file);

$http({
    method: 'post',
    url: '/api/upload',
    data: fd,
    transformRequest: angular.identity,
    headers:{ 'Content-Type': undefined }
});

Serverside(PHP,简化)

$data = [];
foreach($_POST as $prop => $value){
    $data[$prop] = json_decode($value);
}
// $data contains the correct values now ..

答案 2 :(得分:1)

在客户端上使用JSON.stringify发送数字和布尔值,然后在bakend上解析

const form = new FormData;
const data = {
    name: 'john doe',
    active: true,
    count: 42
};

form .append('file', file); // send your file here
form .append('fileProps', JSON.stringify(data));

// then send form with POST from angular with using http

答案 3 :(得分:0)

如果您对布尔值有疑问,则需要发送01

示例:

let data = new FormData()
data.append('type', 0)
data.append('typeSend', 1)

在许多情况下,服务器将理解这是一个布尔值:false = 0true = 1

答案 4 :(得分:0)

我知道这太迟了。但是表单数据不能解释类型数据,例如布尔值,整数等。

最好的方法是将其转换为JSON,并相应地覆盖其中的布尔值的边缘情况。

例如

where foo='foo'

答案 5 :(得分:0)

FormData.append(..)FormData.set(..)始终将值转换为字符串(Blob除外),请参见here

如果发送的值不同于String或Blob,它将自动转换为String:

formData.append('name', true);
formData.append('name', 74);
formData.append('name', 'John');

formData.getAll('name'); // ["true", "74", "John"]

因此您可以按照https://stackoverflow.com/a/39094808/2311074

中的建议使用json编码/解码

但是,如果它只是单个值,并且您知道它必须是布尔值,但将作为字符串发送,则也可以在服务器端将其转换为布尔值:

$is_active = ($this->request->is_active == 'true') ? true : false

答案 6 :(得分:-2)

formData.append('is_active', scope.event.is_active === 'true');

答案 7 :(得分:-2)

这是您的ng-model

ng-model="event.is_active"

那么,为什么不使用ng-model="formData.event.is_active"呢?

然后,在您的脚本文件中,您可以直接将$scope.formData作为对象发送到服务器。