Мне нужно отправить массив данных с помощью HttpClient
из Angular 6
в PHP
сервер.
У меня есть выпадающий список, из которого я выбрал, и вставка в массив:
arrayOfLegalProtection=[];
addSit(){
let l_id = '';
let p_id = '';
let s_id = '';
let add_date = '';
l_id = this.formGroup.controls['l_id'].value;
p_id = this.formGroup.controls['p_id'].value;
s_id = this.formGroup.controls['s_id'].value;
add_date = this.formGroup.controls['add_date'].value;
this.showSubHeader++;
this.arrayOfLegalProtection.push({lId: l_id,
pId: p_id,
sId: s_id,
addDate: add_date})
console.log(this.arrayOfLegalProtection);
}
Результат консоли показывает мне правильные значения:
[{ «LID»: «1», «ИУП»: «1», «Sid»: «2», «addDate»: «2018-09-14»},{ «LID»: «», «Pid»: «1», «Sid»: «5», «addDate»: «2018-09-14»},
{ «LID»: «», «Pid»: «2», «Sid»: «», «addDate»: «2018-09-20»}]
Теперь мне нужно добавить этот массив в метод post httpclient и отправить его на сервер, но, как сказано в обсуждении этого поста, массивы не могут быть отправлены через Angular’s HttpClient
библиотека.
Нам нужно использовать приложение, или JSON.stringify()
или же .append()
,
я опубликовал вопрос после использования метода JSON.stringify()
и, как вы можете видеть, были ошибки. И даже echo count($array)
всегда 1
даже если многомерный массив содержит 0 или N
строки данных.
Поэтому я переключился на другой метод, используя .append()
:
saveUnitData(unit_type,
location_type_id, user_id, number_of_hh, unit_status, add_date, arrayOfActualities)
{
console.log(user_id);
let httpParam = new HttpParams().set('unit_type', unit_type)
.set('location_type_id', location_type_id)
.set('user_id', user_id)
.set('number_of_hh', number_of_hh)
.set('unit_status',unit_status)
.set('add_date', add_date);
Object.keys(arrayOfActualities).forEach(key=>{
httpParam = httpParam.append('arrayOfActualities', arrayOfActualities);
})
//.set('arrayOfActualities', arrayOfActualities);
let headerOptions = new HttpHeaders();
headerOptions.append('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
console.log('h'+arrayOfActualities);
return this.http.post(this.globalVar.UnitSavedataUrl, httpParam, {headers: headerOptions});
}
Используя этот код:
Object.keys(arrayOfActualities).forEach(key=>{
httpParam = httpParam.append('arrayOfActualities', arrayOfActualities);
Я попытался преобразовать объект в массив, используя append, чтобы его можно было отправить через службу httpClient.
В заголовке запроса мы видим обычные отправленные данные, но массив повторяется сотни и сотни раз.
И ответ от сервера всегда:
C: \ wamp64 \ WWW \ DEV \ UnitSaveData.php: 23: строка
«[{ «LegalId»: «», «protectionId»: «», «situationId»: «», «addDate»: «2018-09-14»}, { «legalId»: «», «protectionId»:» », «situationId»: «», «addDate»: «2018-09-14»}] (Длина = 147)
Но ничего не было добавлено в базу данных.
Обратите внимание, что сценарий PHP такой же, как предыдущий пост без ответа
Я нашел решение.
Да, HttpClient()
принять массив как HttpParams()
,
Для углового сценария, Я делал следующее:
let httpParam = new HttpParams().set('unit_type', unit_type)
.set('location_type_id', location_type_id)
.set('user_id', user_id)
.set('number_of_hh', number_of_hh)
.set('unit_status',unit_status)
.set('add_date', add_date)
.set('arrayOfActualities', arrayOfActualities);
Как HttpParams()
упомянутая документация, .set()
принять значение в виде строки, которая запутала серверный скрипт даже при использовании json_encode()
,
Таким образом, решение было добавить arrayOfActualities
массив:
let httpParam = new HttpParams().set('unit_type', unit_type)
.set('location_type_id', location_type_id)
.set('user_id', user_id)
.set('number_of_hh', number_of_hh)
.set('unit_status',unit_status)
.set('add_date', add_date)
.set('arrayOfActualities', arrayOfActualities);
httpParam.append('arrayOfActualities', JSON.stringify(arrayOfActualities));
На стороне PHP, мне нужно использовать json_decode($arr, true)
, чтобы позволить серверному сценарию выполнять итерации по массиву, поскольку итерации по массиву json создавали для меня проблему, поскольку он не мог прочитать заголовки полей из-за двойных кавычек:
$arr = json_decode($arrayOfActualities, true);
if(count($arr)>0)
{
foreach($arr as $array)
{
}
}
...
Как сказал @ Б.Флеминг:
Ваш PHP-скрипт вызывает json_encode (), который производит JSON
строка. Если вы хотите преобразовать JSON в массив, выполните
json_decode (). Прежде всего, тем не менее, убедитесь, что все, что вы
передача в json_decode () уже не является массивом.
Других решений пока нет …