Задать вопрос
@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;
	}
  • Вопрос задан
  • 263 просмотра
Подписаться 1 Простой 3 комментария
Решения вопроса 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
@402d
начинал с бейсика на УКНЦ в 1988
В конце документации внимательно читали ? Там меж строк проскакивает, что бакенд скорее всего написан на сишарпе. И как понимаю их велосипед разбора параметров отличается от PHP.
Так, что внимательно на все их уточнения.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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