это будет супер долгое время!
По общему признанию, я не очень хороший фронтенд-дизайнер, и мои навыки работы с Javascript оставляют желать лучшего.
TL: DR - Чем рабочий код отличается от объекта данных в кодировке JSON (продавец) в нерабочем коде в отношении запроса Axios POST? Разве они не должны давать такой же результат?
Сначала немного предыстории: я создаю бэкэнд Laravel REST с полным набором функций, валидаторами форм, политиками, работами. Я протестировал бэкэнд с клиентом ARC REST для Chrome и убедился, что мой бэкэнд полностью работоспособен.
Проблема: при разработке интерфейса с использованием Vuejs, Vue-Router и Axios у меня возникли проблемы с отправкой данных на сервер. В частности, это сбой проверки формы с ошибкой HTTP 422. Я сузил эту проблему, чтобы она была связана с инкапсуляцией объекта в Vue или Axios.
Вот нерабочий компонент Vue:
<div class="panel panel-default">
<div class="panel-heading">Create Merchant</div>
<div class="panel-body">
<form action="#" @submit.prevent="createMerchant()">
Primary
<input v-model="merchant.primary" type="text" name="primary" class="form-control" autofocus>
Alternate
<input v-model="merchant.alternate" type="text" name="alternate" class="form-control">
Contact
<input v-model="merchant.contact" type="text" name="contact" class="form-control">
Street
<input v-model="merchant.street" type="text" name="street" class="form-control">
City
<input v-model="merchant.city" type="text" name="city" class="form-control">
State
<input v-model="merchant.state" type="text" name="state" class="form-control">
Country
<input v-model="merchant.country" type="text" name="country" class="form-control">
Postal Code
<input v-model="merchant.postalCode" type="text" name="postalCode" class="form-control">
<button type="submit" class="btn btn-primary">Create Merchant</button>
</form>
</div>
</div>
<div v-if='errors && errors.length' class="panel panel-default">
<div class="panel-heading">Error</div>
<div class="panel-body">
<ul>
<li v-for='error of errors'>
{{error.message}}
</li>
</ul>
</div>
</div>
</div>
</template>
<script>
export default {
data() {
return {
merchant: {
primary: '',
alternate: '',
contact: '',
street: '',
city: '',
state: '',
country: '',
postalCode: ''
},
errors: []
};
},
methods: {
createMerchant() { console.log(JSON.stringify(this.merchant));
axios.post('/payment-gateway/public/api/v1/merchant', JSON.stringify(this.merchant))
.then((response) => {
console.log(response.data.id);
this.$router.push({ name: 'merchantList' });
})
.catch(e => {
this.errors.push(e);
});
}
}
}
</script>
Публикуемые данные, с моей точки зрения, кажутся правильными:
{"primary": "Widget Company", "alternate": "Widget Co", "contact": "555-555-0055", "street": "123 Main St", "city": "Olympia", " state ":" WA "," country ":" USA "," postalCode ":" 98501 "}
Но приведенный выше код всегда приводит к ошибке HTTP 422.
Теперь, что меня смущает, это рабочий код:
<div class="panel panel-default">
<div class="panel-heading">Create Merchant</div>
<div class="panel-body">
<form action="#" @submit.prevent="createMerchant()">
Primary
<input v-model="merchant.primary" type="text" name="primary" class="form-control" autofocus>
Alternate
<input v-model="merchant.alternate" type="text" name="alternate" class="form-control">
Contact
<input v-model="merchant.contact" type="text" name="contact" class="form-control">
Street
<input v-model="merchant.street" type="text" name="street" class="form-control">
City
<input v-model="merchant.city" type="text" name="city" class="form-control">
State
<input v-model="merchant.state" type="text" name="state" class="form-control">
Country
<input v-model="merchant.country" type="text" name="country" class="form-control">
Postal Code
<input v-model="merchant.postalCode" type="text" name="postalCode" class="form-control">
<button type="submit" class="btn btn-primary">Create Merchant</button>
</form>
</div>
</div>
<div v-if='errors && errors.length' class="panel panel-default">
<div class="panel-heading">Error</div>
<div class="panel-body">
<ul>
<li v-for='error of errors'>
{{error.message}}
</li>
</ul>
</div>
</div>
</div>
</template>
<script>
export default {
data() {
return {
merchant: {
primary: '',
alternate: '',
contact: '',
street: '',
city: '',
state: '',
country: '',
postalCode: ''
},
errors: []
};
},
methods: {
createMerchant() { console.log(JSON.stringify(this.merchant));
axios.post('/payment-gateway/public/api/v1/merchant', {
primary: this.merchant.primary,
alternate: this.merchant.alternate,
contact: this.merchant.contact,
street: this.merchant.street,
city: this.merchant.city,
state: this.merchant.state,
country: this.merchant.country,
postalCode: this.merchant.postalCode
})
.then((response) => {
console.log(response.data.id);
this.$router.push({ name: 'merchantList' });
})
.catch(e => {
this.errors.push(e);
});
}
}
}
</script>
Итак, мой вопрос: чем рабочий код отличается от объекта данных в кодировке JSON (продавец) в нерабочем коде?
application/json
. Сообщите мне, как проходит ваше тестирование, и я добавлю ответ, если это проблема. Не торопитесь добавлять еще, потому что я не уверен на 100%. - person webnoob   schedule 13.11.2017