2

我正在尝试使用 HTTP cordova 插件发出发布请求。但是,由于某种原因,服务器端使用的 JSON 数据的格式不正确(json 括号)。有人可以帮我吗?

进口:

import { HTTP } from '@ionic-native/http';

请求实现:

public sendData(sufix, json) {

    return new Promise((resolve, reject) => {

        this.http.post(URL+sufix, JSON.stringify(json), {'Content-Type': 'application/json'}).then(result => {
            resolve(result.data);
        }).catch(error => {
            reject(error);
        });

    });
}

发送的json:

{名称:'测试'}

服务器收到的内容:

=%7B%22名称%22%3A%22Test%22%7D

服务器实现:

@Path("/register")
public class RegisterEndPoint {

    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public Response registerUser(UserDTO userDTO) {

        // Create DAO for persistence
        FactoryDAO factory = new FactoryDAO();
        UserDAO userDAO = factory.getUserDAO();

        // Create user to be persisted
        if (!userDAO.userExist(userDTO.getEmail())) {

            User user = new User();
            user.setPassword(userDTO.getPassword());
            user.setEmail(userDTO.getEmail());
            user.setName(userDTO.getName());
            userDAO.persist(user);
            userDAO.commit();
            return Response.status(200).build();

        }
        return Response.status(405).entity(new ErrorDTO("User already registered!")).build();

    }


}
4

4 回答 4

3

问题似乎出在 Native Plugin 中,因此我已更改为 angular http 解决方案,并且效果很好。请按照我执行的解决方案进行操作。感谢所有帮助过我的人。

所需进口:

import { Http, Headers, RequestOptions, Response } from  '@angular/http';
import { Observable } from 'rxjs/Rx'
import 'rxjs/add/operator/catch';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/do';
import 'rxjs/add/operator/timeout';

身份验证提供者:

public sendRequest(sufix, json) {

    let headers = new Headers({ 'Content-Type': 'application/json' });
    let options = new RequestOptions({ headers: headers });
    return this.http.post(URL+sufix, json, options)
        .timeout(TIMEOUT_REQUEST*1000)
        .do(this.logResponse)
        .map(this.extractData)
        .catch(this.handleError)

}

private logResponse(res: Response) {
    console.log(res);
}

private extractData(res: Response) {
    return res.json();
}

private handleError(res: Response | any) {
    return Observable.throw(res.json().error || 'Fail to connect to the server');
}

调用 AuthProvider:

this.authProvider.sendRequest('register', this.signup).subscribe((data) => {
    console.log('Success!');
}, (error) => {
    console.log(error);
});

app.module.ts 中包含的提供程序

import { HttpModule, JsonpModule } from '@angular/http';
于 2017-07-15T00:16:57.673 回答
1

您能否尝试发送正文而不将其设为字符串。您可以在不进行字符串化的情况下发送 JSON 对象。试试看 :)

**更新发送后

{name: 'Test'}

如果你得到name = "test"

你为什么不试试这样

var data =  JSON.stringify(data);
var obj = {data:data};
//send the obj Object

所以它将显示为 data = "{name:test}"

现在从服务器解析它。试着让我知道:)

于 2017-07-14T04:15:01.560 回答
1

如果您尝试使用 HTTP 发出 post 请求,请尝试以这种格式发送请求。

let body = new FormData(); body.append('name', 'Test'); this.http.post(<url>,body);

试着让我知道它是否适合你。

于 2017-07-14T06:07:00.300 回答
1

只需在发布之前添加 this.http.setDataSerializer('json')

于 2017-11-11T22:26:53.717 回答