node.js https клиент. Сервер не получает данных POST [дубликат]

Я прочитал все сообщения здесь и понял, что нам может понадобиться пример реальной жизни. Почему на самом деле у нас есть @property? Итак, рассмотрите приложение Flask, в котором вы используете систему аутентификации. Вы объявляете модель User в models.py:

class User(UserMixin, db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(64), unique=True, index=True)
    username = db.Column(db.String(64), unique=True, index=True)
    password_hash = db.Column(db.String(128))

    ...

    @property
    def password(self):
        raise AttributeError('password is not a readable attribute')

    @password.setter
    def password(self, password):
        self.password_hash = generate_password_hash(password)

    def verify_password(self, password):
        return check_password_hash(self.password_hash, password)

В этом коде у нас есть «скрытый» атрибут password с помощью @property, который запускает утверждение AttributeError при попытке доступа к нему напрямую, в то время как мы использовали @ property.setter для установки фактической переменной экземпляра password_hash.

Теперь в auth/views.py мы можем создать экземпляр пользователя с помощью:

...
@auth.route('/register', methods=['GET', 'POST'])
def register():
    form = RegisterForm()
    if form.validate_on_submit():
        user = User(email=form.email.data,
                    username=form.username.data,
                    password=form.password.data)
        db.session.add(user)
        db.session.commit()
...

Атрибут уведомления password, который поступает из регистрационной формы, когда пользователь заполняет форму. [3]

Надеюсь, что этот пример будет полезен

6
задан Jonathon Reinhart 20 May 2014 в 04:42
поделиться

3 ответа

Отличный ответ Фила, однако, поскольку название OP говорит

, отправьте json-объект из javascript (не jQuery) в php

, вот как сделайте это с помощью (ванильного) javascript, если это поможет кому-то найти этот метод:

var jsondata;
var flickr = {'action': 'Flickr', 'get':'getPublicPhotos'};
var data = JSON.stringify(flickr);

var xhr = new XMLHttpRequest();
xhr.open("POST", "../phpincl/apiConnect.php", !0);
xhr.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
xhr.send(data);
xhr.onreadystatechange = function () {
    if (xhr.readyState === 4 && xhr.status === 200) {
        // in case we reply back from server
        jsondata = JSON.parse(xhr.responseText);
        console.log(jsondata);
    }
}

Обратите внимание, что нам все равно нужно преобразовать ответ сервера в объект javascript , используя JSON.parse()

Теперь, на стороне сервера (на основе ответа Фила), если вы отправляете ответ клиенту, вы можете сделать:

header('Content-type: application/json');
$json = file_get_contents('php://input');
$json_decode = json_decode($json, true); 
$json_encode = json_encode($json_decode);
echo $json_encode;

ПРИМЕЧАНИЕ:

Причина, по которой сначала происходит декодирование, а затем кодирование обратного входного сигнала json, заключается в том, что escape сбрасывает (возможно) URL-адреса внутри данных, например

json_encode преобразует этот URL

http://example.com

в

http:\/\/example.com

... что не относится к OP, но полезно в некоторых других сценариях.

5
ответ дан JFK 22 August 2018 в 15:17
поделиться
  • 1
    Спасибо за ответ JFK. Мое название говорит Javascript, но я указал Javascript / Jquery в описании. – Vish 10 August 2015 в 17:11
  • 2
    @Vish: не проблема, я просто предоставлял способ сделать это с помощью javascript только в том случае, если кто-то не хочет включать jQuery – JFK 10 August 2015 в 20:26
  • 3
    оцените ваши усилия, и я рад узнать оба способа решения проблемы :) – Vish 10 August 2015 в 20:53

Использование:

makeFlickrCall( { data: JSON.stringify( flickr )} );

Вместо

makeFlickrCall(flickr);

Ваш сценарий на стороне сервера должен получить ваш JSON следующим образом:

data="{"action":"Flickr","get":"getPublicPhotos"}"
1
ответ дан PeterKA 22 August 2018 в 15:17
поделиться

Стандартный метод jQuery .ajax() использует свойство data для создания строки x-www-form-urlencoded для передачи в тело запроса. Что-то вроде этого

action=Flickr&get=getPublicPhotos

Поэтому ваш PHP-скрипт не должен искать $_POST['data'], а вместо этого $_POST['action'] и $_POST['get'].

Если вы хотите отправить сырое JSON для PHP, затем сделайте следующее ...

Установите параметр AJAX contentType на application/json и отправьте строчную версию вашего объекта JSON в качестве data, например

$.ajax({
    url: '../phpincl/apiConnect.php',
    type: 'POST',
    contentType: 'application/json',
    data: JSON.stringify(flickrObj),
    dataType: 'json'
})

Затем ваш PHP-скрипт будет считывать полезную нагрузку данных из потока php://input, например

$json = file_get_contents('php://input');

. Затем вы можете разобрать это в PHP объект или массив ...

$dataObject = json_decode($json);
$dataArray = json_decode($json, true);

И, если вы просто хотите повторить его обратно клиенту ..

header('Content-type: application/json');

// unmodified
echo $json;

// or if you've made changes to say $dataArray
echo json_encode($dataArray);
9
ответ дан Phil 22 August 2018 в 15:17
поделиться
  • 1
    что мне нужно сделать, чтобы почта работала $ _POST ['data'] и возвращала объект обратно в javascript? – Vish 20 May 2014 в 05:01
  • 2
    @Vish Я обновил свой ответ – Phil 20 May 2014 в 05:39
  • 3
    @Phil Очень полезный ответ: могу ли я заставить php отправить назад выполнение выполнения несколько раз того, что происходит в данный момент ?, потому что мое выполнение php слишком длинное. – Yousif 15 July 2015 в 11:58
Другие вопросы по тегам:

Похожие вопросы: