Я работаю над проектом, который получает массив целых чисел из API и печатает их на экране. Проблема здесь в том, что POSTMAN показывает, что есть данные в формате json без ошибок, как показано на рисунке, но response js говорит, что данных нет.
public function __construct()
{
$this->load->database();
}
public function getAllProducts()
{
$query = $this->db->get('products');
return $query->result_array();
}
private function cutifyProduct($productResult,$isSingle=false){
foreach($productResult as $key => $product){
$productId = $product['id'];
$mediaQuery = $this->db->get_where('media',array('productId'=>$productId));
$categoryQuery = $this->db->get_where('categories',array('id'=>$product['categoryId']));
$thisProductCategory = $categoryQuery->result_array()[0];
$productResult[$key]['categoryTitle'] = $thisProductCategory['name'];
if ($isSingle){
//for breadcrumb
$breadcrumb = [];
$breadcrumb[] = $thisProductCategory;
while($thisProductCategory['parentId']!=0){
$categoryQuery = $this->db->get_where('categories',array('id'=>$thisProductCategory['parentId']));
$thisProductCategory = $categoryQuery->result_array()[0];
$breadcrumb[] = $thisProductCategory;
};
$productResult[$key]['breadcrumb'] = $breadcrumb;
//for product attributes
$attributes = [];
$tempSizeAttribute = array();
$tempColorAttribute = [];
$tempStorageAttribute = [];
$tempRamAttribute = [];
$attributesQuery = $this->db->get_where('attributes',array('productId'=>$productId));
$thisProductAttributes = $attributesQuery->result_array();
$attributes['size'] = array(
"sizeType"=>"UK",
"sizes"=>array(1,2,3),
);
foreach($thisProductAttributes as $productAttribute){
if ($productAttribute['title']= = "size"){
//$attributes['size']['sizes'][] = (int) $productAttribute['name'];
$tempSizeAttribute[]=(int) $productAttribute['name'];
}elseif ($productAttribute['title']= = "color"){
$tempColorAttribute[] = array(
"productId"=>explode("|",$productAttribute['name'])[0],
"name"=>explode("|",$productAttribute['name'])[1],
);
}
}
$attributes['size']['sizes'] =array_merge($attributes['size']['sizes'],$tempSizeAttribute);
$productResult[$key]['attributes'] = $attributes;
//for vendor information
$vendorInfo = [];
$vendorQuery = $this->db->get_where('vendors',array('id'=>$product['vendorId']));
$vendorResult = $vendorQuery->result_array();
$productResult[$key]['vendorDetails'] = $vendorResult;
}
$productResult[$key]['media'] = $mediaQuery->result_array();
$productResult[$key]['link'] = "/product/".$productResult[$key]['slug'];
if ($productResult[$key]['discountPercent']= = "0.00" || $productResult[$key]['discountPercent']==0 || $productResult[$key]['discountPercent']= = "0" || $productResult[$key]['discountPercent']= = "0.0"){
$productResult[$key]['price'] = array(
"current"=> $productResult[$key]['price'],
);
}else{
$productResult[$key]['price'] = array(
"current"=> $productResult[$key]['price'] - (($productResult[$key]['discountPercent']*$productResult[$key]['price'])/100),
"previous"=> $productResult[$key]['price'],
);
}
foreach($productResult[$key]['media'] as $mediaKey => $media){
if ($isSingle){
if ($media['isPrimary']= = "1" || $media['isPrimary']==1 ){
if (substr( $media['url'], 0, 4 ) != "http"){
$productResult[$key]['image']= "https://admin.ratomatoshop.com/media/medium/".$media['url'];
}
}
if (substr( $media['url'], 0, 4 ) != "http"){
$productResult[$key]['images']['medium'][]= "https://admin.ratomatoshop.com/media/medium/".$media['url'];
$productResult[$key]['images']['original'][]= "https://admin.ratomatoshop.com/media/original/".$media['url'];
}else{
$productResult[$key]['images']['original'][]=$media['url'];
}
}else{
if ($media['isPrimary']= = "1" || $media['isPrimary']==1 ){
if (substr( $media['url'], 0, 4 ) != "http"){
$productResult[$key]['image']= "https://admin.ratomatoshop.com/media/small/".$media['url'];
}
}
}
}
}
return $productResult;
}
public function getLatestProducts($noOfProducts)
{
$this->db->order_by('id', 'DESC');
$this->db->limit($noOfProducts);
$query = $this->db->get('products');
$productResult = $query->result_array();
return $this->cutifyProduct($productResult);
}
public function getOnSaleProducts($noOfProducts)
{
$this->db->order_by('discountPercent', 'DESC');
$this->db->limit($noOfProducts);
$query = $this->db->get('products');
$productResult = $query->result_array();
return $this->cutifyProduct($productResult);
}
public function getTopRatedProducts($noOfProducts)
{
$this->db->order_by('rating', 'DESC');
$this->db->limit($noOfProducts);
$query = $this->db->get('products');
$productResult = $query->result_array();
return $this->cutifyProduct($productResult);
}
public function getProductData($productSlug)
{
$query = $this->db->get_where('products',array('slug'=>$productSlug));
$productResult = $query->result_array();
return $this->cutifyProduct($productResult,true);
}
public function getFeaturedProducts($noOfProducts)
{
$this->db->order_by('id', 'DESC');
$this->db->limit($noOfProducts);
$query = $this->db->get('featuredproducts');
$results = $query->result_array();
$products = [];
foreach($results as $result ){
$products[] = $this->getWhere('id',$result['productId']);
}
return $this->cutifyProduct($products);
}
public function getSpecialProducts($noOfProducts)
{
$this->db->order_by('id', 'DESC');
$this->db->limit($noOfProducts);
$query = $this->db->get('specialproducts');
$results = $query->result_array();
$products = [];
foreach($results as $result ){
$product = $this->getWhere('id',$result['productId'])[0];
$product['dateEnd'] = $result['dateEnd'];
$product['discountPercent'] = $result['discountPercent'];
$products[] = $product;
}
return $this->cutifyProduct($products);
}
public function newProduct($productData)
{
return $this->db->insert('products',$productData);
}
public function isProduct($productId){
$product = $this->getWhere('id',$productId);
if ($product!=null && is_array($product) && count($product)>0){
return true;
}else{
return false;
}
}
public function getWhere($key,$value){
$query = $this->db->get_where('products',array($key=>$value));
return $query->result_array();
}
}
Ответ почтальона от api (нажмите, чтобы увидеть код) Это ответ почтальона
"attributes": {
"size": {
"sizeType": "UK",
"sizes": [
1,
2,
3,
36,
37,
38,
39,
40
]
}
},
Данные json, которые реагируют, получают. (Нажмите, чтобы увидеть код)
Это журнал консоли реакции:
"attributes": {
"size": {
"sizeType": "UK",
"sizes": [
1,
2,
3,
]
}
},
Практически невозможно, чтобы .json() не учитывал данные в какой-либо форме. Если ответ сервера является допустимым json, он будет в объекте. Откройте свое приложение для реагирования, например, chrome, открываю инспектор, попадаю во вкладку сети и смотри запрос к api. Вы должны увидеть там сериализованный ответ json. Если он не содержит ваших данных, сервер его не отправил.
привет @trixn, я обновил вопрос. Пожалуйста, проверьте еще раз
@trixn то же самое и во вкладке сети. данные там тоже неполные
Тогда проблема явно на стороне сервера. Если ответ содержит данные, вы увидите их там.
@trixn, но поскольку почтальон показывает, что данные есть, в чем может быть проблема. Если возникла проблема на стороне сервера, почтальон тоже не должен был показывать там данные.
Без подробностей сложно сказать. Вы уверены, что сравниваете ответ, отправленный сервером, и ответ, полученный клиентом на один и тот же запрос? Данные так не теряются. Возможно, продукт, который вы загружаете, не имеет ожидаемых атрибутов и $tempSizeAttribute пуст.
Можете ли вы поделиться своим полным кодом API и запросом с помощью выбранного метода? (ПОЛУЧАТЬ)
Если он работает в почтальоне, но вкладка сети показывает разные результаты, убедитесь, что вы отправляете одинаковые заголовки как с запросом почтальона, так и с запросом, который вы делаете в ответ.
Как вы оцениваете результат в Postman? (Грубый, красивый, ...)
@trixn Я все проверил, есть данные в атрибуте $ tempSizeAttribute, а сервер - допустимый формат json,
@Michael Я обновил полный код api в вопросе. В реакции и почтальоне я использовал метод POST. Я просматриваю результат в Preety + JSON. Я проверил ответ (от почтальона) и подтвердил, что это действительный JSON.
@TPHughes, как проверить заголовки? Я не проверял, но почти уверен, что заголовки совпадают.
Я не знаю, какой браузер вы используете, но перейдите на вкладку «Инструменты разработчика» и «Сеть». Там вы можете проверить заголовок, а также необработанный ответ. Я думаю, что что-то происходит при переходе от API json response >> response output. @trixn уже упоминалось
хотя ничего не помогло
Этот API общедоступен? Если да, вы можете поделиться вызовом API
Я не вижу причин, по которым Postman дал бы другой ответ приложению React. Пока все ваши заголовки, данные и тому подобное одинаковы. Вы можете найти заголовки, отправленные React, нажав на вкладку сети и просмотрев запрос. Опубликуйте весь массив данных, а также снимок экрана или что-то в этом роде вашего приложения почтальона, чтобы мы могли видеть. Я думаю, что между ними должно быть что-то другое.
Можете ли вы быть абсолютно уверены в том, что опубликованный вами ответ является точным? Это данные, которые вы получаете до того, как обработаете их каким-либо образом? Зарегистрируйте необработанный ответ от api.
@Michael, адрес API: api.ratomatoshop.com/index.php/Products/getProductData/….
Вот результат, который я получил из вашего API: "sizes": [36, 37, 38, 39, 40]. Я думаю, вы получаете их из БД. Как выглядят значения в БД? Это супер странно ...






Добро пожаловать в Stackoverflow. Изображения и скриншоты могут быть хорошим дополнением к сообщению, но убедитесь, что пост по-прежнему понятен и полезен без них. Если вы публикуете изображения кода или сообщения об ошибках, убедитесь, что вы также скопировали и вставили или набрали фактический код / сообщение непосредственно в сообщение.