Собственный HTTP-плагин (IONIC 3)

Я пытаюсь сделать почтовый запрос с помощью плагина 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%22Тест%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();

    }


}

person Pedro Durek    schedule 14.07.2017    source источник
comment
Просто добавьте this.http.setDataSerializer(‘json’) перед публикацией   -  person Pawan Mittal    schedule 12.11.2017


Ответы (4)


Проблема, похоже, в собственном плагине, поэтому я перешел на угловое 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';
person Pedro Durek    schedule 15.07.2017
comment
Вы когда-нибудь пытались снова использовать ionic native? у нас такая же проблема! Данные не могут быть отправлены на сервер. - person Michael Burger; 10.08.2017

не могли бы вы попробовать отправить тело, не превращая его в строку. вы можете отправить объект JSON без строки. Попробуйте :)

**ОБНОВЛЕНИЕ После отправки этого

{name: 'Test'}

Если вы получаете name = "test"

Почему бы тебе не попробовать вот так

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

Таким образом, он будет отображаться как data = "{name:test}"

Теперь разберите его с сервера. Попробуйте и дайте мне знать :)

person Diluk Angelo    schedule 14.07.2017
comment
Привет, спасибо за ваш ответ. Я пробовал, но результат был "name=Test", без шаблона json - person Pedro Durek; 14.07.2017
comment
Еще раз спасибо, не работает =(. data=%7B%22name%22%3A%22Test%22%7D - person Pedro Durek; 14.07.2017
comment
как вы анализируете это с сервера? - person Diluk Angelo; 14.07.2017
comment
Это Java-сервер. Я использую технологию Rest (каркас Джерси). Оказывается, при отправке запроса через Java Client такого поведения не происходит, я не думаю, что это проблема синтаксического анализа. - person Pedro Durek; 14.07.2017
comment
привет @PedroDurek, это не проблема с Ionic Plugin, это со стороны вашего сервера. Я проверю на Jersey Framework и дам вам знать :) - person Diluk Angelo; 14.07.2017
comment
Хорошо, спасибо большое =) - person Pedro Durek; 14.07.2017
comment
Можете ли вы предоставить мне свой код для этого метода POST? - person Diluk Angelo; 14.07.2017
comment
Я разместил это. то, что я пытался сделать, это заменить объект userDTO на переменную String в параметре метода, и результаты были такими, как я показал выше. - person Pedro Durek; 14.07.2017

если вы пытаетесь сделать почтовый запрос с использованием HTTP, попробуйте отправить запрос в этом формате.

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

Попробуйте и дайте мне знать, если это работает для вас.

person N.Moudgil    schedule 14.07.2017
comment
Спасибо за ваш ответ, но, к сожалению, это не сработало, сервер получил пустую строку. - person Pedro Durek; 14.07.2017
comment
Попробуйте использовать импорт {Http} из ''@angular/http'' - person N.Moudgil; 14.07.2017

Просто добавьте this.http.setDataSerializer(‘json’) перед публикацией

person Pawan Mittal    schedule 11.11.2017