@IceNix

Не получается составить запрос к API на PHP, может кто поможет идеями?

Добрый день Подключаюсь к стороннему API, есть Мануал по отправке GET запроса для оформления заказа :
Мануал
65414f14b8dcc655988539.png


Не могу составить параметр items в котором не понятный мне формат массива в строке я как только не пробовал отправить данные разными способами собрать массив в том числе и в ручную к примеру:
spoiler

[{290775П29,ГАЗ,Ростов-на-Дону,14.04,1,0,0,,77068}]
[{'290775П29','ГАЗ','Ростов-на-Дону','14.04','1','0','0','','77068'}]
[{"290775П29","ГАЗ","Ростов-на-Дону",14.04,1,0,0,"",77068}]
[{"290775П29","ГАЗ","Ростов-на-Дону","14.04","1","0","0","","77068"}]
[{article='290775П29',brand='ГАЗ',supplierName='Ростов-на-Дону',costSale='14.04',quantity='1',supplierTimeMin='0',supplierTimeMax='0',comment='',GioID='77068'}]
[{article=>'290775П29',brand=>'ГАЗ',supplierName=>'Ростов-на-Дону',costSale=>'14.04',quantity=>'1',supplierTimeMin=>'0',supplierTimeMax=>'0',comment=>'',GioID=>'77068'}]
[{'article'=>'290775П29','brand'=>'ГАЗ','supplierName'=>'Ростов-на-Дону','costSale'=>'14.04','quantity'=>'1','supplierTimeMin'=>'0','supplierTimeMax'=>'0','comment'=>'','GioID'=>'77068'}]
[{'article'='290775П29','brand'='ГАЗ','supplierName'='Ростов-на-Дону','costSale'='14.04','quantity'='1','supplierTimeMin'='0','supplierTimeMax'='0','comment'='','GioID'='77068'}]

Не один из вариантов не проходит, пробовал и serialize и json даже print_r. не пойму что имели ввиду разработчики API? Естественно строка была пропущена через urlencode.
Итог API меня не понимает и не разбирает то что я отправляю.
Запрос формирую методами PHP. Так же есть такой пример :
Пример С
HttpClient client = new HttpClient();
string lp = Convert.ToBase64String(Encoding.UTF8.GetBytes(login + ":" + password)).ToString();
Uri url = new Uri("https://api.xn--80aep1aarf3h.xn--p1ai/SearchService/AddOrder?items=" + HttpUtility.UrlEncode(items));
client.BaseAddress = url;
client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", lp);
var response = client.GetAsync(url).Result;

Но мне он не дает ни какой полезной инфы.
Другие функции API все реализованы без непонятного массива и все просто реализованы и работают без проблем.
Может я не понимаю очевидного? Буду рад любым идеям. Спасибо.

Код
$SendPart[0]['article']= $Part['WebService_Data']['Article'];
		$SendPart[0]['brand']= $Part['WebService_Data']['brand'];
		$SendPart[0]['SupplierName']= $Part['WebService_Data']['SupplierName'];
		$SendPart[0]['CostSale']= $Part['WebService_Data']['CostSale'];
		$SendPart[0]['SupplierTimeMin']= $Part['WebService_Data']['supplierTimeMin'];
		$SendPart[0]['SupplierTimeMax']= $Part['WebService_Data']['supplierTimeMax'];
		$SendPart[0]['Quantity']= (int)$Part['count'];
		$SendPart[0]['Comment']=$Comment;
		$SendPart[0]['GioID']= (int)$Part['parts_id'];
		
		$SendUri=json_encode($SendPart);
		$data = AddOrder($SendUri);

	public function AddOrder($SendUri) {
		$url = $this->url.'/SearchService/AddOrder?items='.urlencode($SendUri).'';
		$auth = base64_encode($this->login.":".$this->pass);
		$arrContextOptions=array(
			"ssl"=>array(
				"verify_peer"=>false,
				"verify_peer_name"=>false,
			),
			"http"=>array(
				"header"=>"Authorization: Basic $auth",
				'ignore_errors' => true,
			),
		); 
		try {
			$result = file_get_contents($url,false, stream_context_create($arrContextOptions));
			if($result==false){
				throw new Exception('Error');  
			} else {
				//$result=json_decode($result, true);
			}
		}catch (Exception $e) {  
			$result['Error']="file_get_contents Error";
		}
		echo $url;
		return $result;
	}
  • Вопрос задан
  • 261 просмотр
Решения вопроса 1
@godlikebasic
Backend PHP
Подключаете АвтоСоюз, как я погляжу)

Вы просто пропустили `items`, в качестве ключа корневого массива

Отправляемый массив должен выглядеть примерно так:
$send = [
'items' =>
   [
        'Article' => 'sku22',
        'Brand' => 'Toyota',
        'SupplierName' => 'Kolesa LLP',
        'CostSale' => 512,
        'Quantity' => 1,
        'SupplierTimeMin' => 1,
        'SupplierTimeMax' => 10,
        'Comment' => 'comment',
        'GioID' => 2
    ],
   [
        'Article' => 'ads2512',
        'Brand' => 'Nissan',
        'SupplierName' => 'RDM',
        'CostSale' => 6115,
        'Quantity' => 1,
        'SupplierTimeMin' => 1,
        'SupplierTimeMax' => 10,
        'Comment' => 'comment',
        'GioID' => 2
    ]
];


UPDATE:
да, оказалось несколько сложнее, сначала нужно список товаров превратить в строку и только потом класть её в 'items'
вот код который работает аналогично нашему:
$parts = [
    [
    "Article"         => 'H020',
    'Brand'           => 'ИННОВАТОР',
    'SupplierName'    => 'Ростов-на-Дону',
    'CostSale'        => '7.97',
    'Quantity'        => 1,
    'SupplierTimeMin' => 0,
    'SupplierTimeMax' => 0,
    'Comment'         => '',
    'GioID'           => 0]
];
$url = 'https://xn--80aep1aarf3h.xn--p1ai/SearchService/AddOrder';
$encoded = json_encode($parts, JSON_UNESCAPED_UNICODE); 
var_dump($encoded);
$urlParams = ['items' => $encoded]; 
$get_params = http_build_query($urlParams);
var_dump($get_params);
$full_url = $url. '?' .$get_params;

var_dump($full_url);


дампы:
$encoded
[{"Article":"H020","Brand":"ИННОВАТОР","SupplierName":"Ростов-на-Дону","CostSale":"7.97","Quantity":1,"SupplierTimeMin":0,"SupplierTimeMax":0,"Comment":"","GioID":0}]```

$get_params
items=%5B%7B%22Article%22%3A%22H020%22%2C%22Brand%22%3A%22%D0%98%D0%9D%D0%9D%D0%9E%D0%92%D0%90%D0%A2%D0%9E%D0%A0%22%2C%22SupplierName%22%3A%22%D0%A0%D0%BE%D1%81%D1%82%D0%BE%D0%B2-%D0%BD%D0%B0-%D0%94%D0%BE%D0%BD%D1%83%22%2C%22CostSale%22%3A%227.97%22%2C%22Quantity%22%3A1%2C%22SupplierTimeMin%22%3A0%2C%22SupplierTimeMax%22%3A0%2C%22Comment%22%3A%22%22%2C%22GioID%22%3A0%7D%5D

$full_url
https://xn--80aep1aarf3h.xn--p1ai/SearchService/AddOrder?items=%5B%7B%22Article%22%3A%22H020%22%2C%22Brand%22%3A%22%D0%98%D0%9D%D0%9D%D0%9E%D0%92%D0%90%D0%A2%D0%9E%D0%A0%22%2C%22SupplierName%22%3A%22%D0%A0%D0%BE%D1%81%D1%82%D0%BE%D0%B2-%D0%BD%D0%B0-%D0%94%D0%BE%D0%BD%D1%83%22%2C%22CostSale%22%3A%227.97%22%2C%22Quantity%22%3A1%2C%22SupplierTimeMin%22%3A0%2C%22SupplierTimeMax%22%3A0%2C%22Comment%22%3A%22%22%2C%22GioID%22%3A0%7D%5D


плюс обращаю внимание на ключи массива: 'article' != 'Article'
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
DanArst
@DanArst
Гриффиндор в моде при любой погоде!
Там же написано массив объектов. Если не знаешь, что это, то можно загуглить. В твоей задаче в PHP примерно следующий вид:
$items = array(
    0 => array(
        'article' => 'sku22',
        'brand' => 'Toyota',
        'SupplierName' => 'Kolesa LLP',
        'CostSale' => 512
    ),
    1 => array(
        'article' => 'ads2512',
        'brand' => 'Nissan',
        'SupplierName' => 'RDM',
        'CostSale' => 6115
    ),
);

echo json_encode($items);
//Результат [{"article":"sku22","brand":"Toyota","SupplierName":"Kolesa LLP","CostSale":512},{"article":"ads2512","brand":"Nissan","SupplierName":"RDM","CostSale":6115}]
Ответ написан
@402d
начинал с бейсика на УКНЦ в 1988
В конце документации внимательно читали ? Там меж строк проскакивает, что бакенд скорее всего написан на сишарпе. И как понимаю их велосипед разбора параметров отличается от PHP.
Так, что внимательно на все их уточнения.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽
28 апр. 2024, в 00:54
10000 руб./за проект
28 апр. 2024, в 00:53
70000 руб./за проект
27 апр. 2024, в 21:24
150000 руб./за проект