Curl итеративно передает несколько полезных данных из json или массива

avatar
Adrah Wynfred
1 июля 2021 в 15:39
70
1
0

Как передать многомерный ассоциативный массив или json в качестве полезной нагрузки в запрос cURL. Я уже какое-то время безуспешно пытаюсь понять это.

Вот что я сделал до сих пор. Я делаю запрос на завивание и передаю json в поля CURLOPT_POSTFIELDS. Это работает нормально. Проблема в том, что я хочу, чтобы код запускался для нескольких пользователей, которые находятся в строке json, сохраненной в переменной

.
<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'https://test.url/tokens',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'POST',
  CURLOPT_POSTFIELDS =>'{
    "customerName": "orland",
        "mno": "Network",
        "amount": "1",
        "msisdn": "447911123456",
        "description": "Awaiting",
        "reference": "0fgdufgdfgdfs" 
}',
  CURLOPT_HTTPHEADER => array(
    'Content-Type: application/json',
  ),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;

Приведенный выше код работает нормально.

Но полезная нагрузка для CURLOPT_POSTFIELDS не фиксирована. Вот что я пытался сделать, я закодировал строку json и попытался передать ее в цикл for. Я уверен, что подход неплохой, но я не совсем правильно понимаю синтаксис. Вот мой код.

<?php
$recip = '[{
        "customerName": "Sorland",
        "mno": "Network",
        "amount": "1",
        "msisdn": "447911123346",
        "description": "Awaiting",
        "reference": "0fgdufgdfgdfs" 
    },
    {
        "customerName": "Corland",
        "mno": "MTN",
        "amount": 1,
        "msisdn": "447911123678",
        "description": "Awaiting",
        "reference": "0jsbfbsubfhbj" 
    },
    {
        "customerName": "orland",
        "mno": "MTN",
        "amount": 1,
        "msisdn": "447911123111",
        "description": "Awaiting",
        "reference": "1234568djnfjnfjds" 
}]';

    $curl = curl_init();
    
    curl_setopt_array($curl, array(
          CURLOPT_URL => 'https://test.url.com/api/',
          CURLOPT_RETURNTRANSFER => true,
          CURLOPT_ENCODING => '',
          CURLOPT_MAXREDIRS => 10,
          CURLOPT_TIMEOUT => 0,
          CURLOPT_FOLLOWLOCATION => true,
          CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
          CURLOPT_CUSTOMREQUEST => 'POST',
          CURLOPT_POSTFIELDS =>
    echo ("'{<br>");
    foreach($arr[$keys[$i]] as $key => $value) {

        echo implode($key . " : " . $value . ",<br>");
    }
    echo "}',<br>";
        CURLOPT_HTTPHEADER => array(
        'Content-Type: application/json',
      ),
    ));

    $response = curl_exec($curl);

    curl_close($curl);
    echo $response;
}

Я хочу использовать цикл for для выполнения нескольких запросов curl с разными полезными нагрузками, а полезные нагрузки поступают из приведенных выше данных json. Я преобразовал json в массив, чтобы можно было выполнить цикл, и преобразовал его обратно в json для CURLOPT_POSTFIELDS.

.
Источник
RiggsFolly
1 июля 2021 в 15:49
0

Почему вы берете строку JSON, преобразуя ее в массив PHP. .... только чтобы преобразовать его обратно в строку JSON... Или я что-то упустил

Adrah Wynfred
1 июля 2021 в 16:01
0

Хорошо, я понимаю тебя @RiggsFolly. Я следовал некоторым учебникам и закончил с этим. Пожалуйста, как бы вы предложили мне действовать?

RiggsFolly
1 июля 2021 в 16:09
0

Не совсем уверен, что вы пытаетесь сделать, но добавление всех 4 этих массивов в структуру данных JSON сделает его недействительным json

Adrah Wynfred
1 июля 2021 в 16:20
1

Хорошо, если вы не уверены в том, чего я пытаюсь достичь, возможно, мне следует перефразировать вопрос. Мой первый код выполняет вызов curl с полезной нагрузкой. Я просто пытаюсь сделать вызов curl несколько раз. Но полезная нагрузка будет исходить из json.

Adrah Wynfred
2 июля 2021 в 16:10
0

@RiggsFolly, я только что отредактировал вопрос. надеюсь теперь понятнее

Ответы (1)

avatar
RiggsFolly
2 июля 2021 в 16:30
0

Это кажется более простым способом сделать несколько вызовов curl и сохранить ответы, надеюсь, на этот раз я попал в точку :)

$recip = 
    '[
        {"customerName": "Sorland", "mno": "Network", "amount": "1",
        "msisdn": "447911123346","description": "Awaiting","reference": "0fgdufgdfgdfs" 
        },
        {"customerName": "Corland","mno": "MTN","amount": 1,
         "msisdn": "447911123678","description": "Awaiting","reference": "0jsbfbsubfhbj" 
        },
        {"customerName": "orland","mno": "MTN","amount": 1,"msisdn": "447911123111",
         "description": "Awaiting","reference": "1234568djnfjnfjds" 
        }
    ]';


// make a PHP datatype out of the JSON so you can use it

$recipients = json_decode($recip);

$responses = [];

foreach ( $recipients as $r) {
   
    $curl = curl_init();
    // convert $r back to json so it can be passed as param
    $postfield = json_encode($r);
    
    curl_setopt_array($curl, array(
        CURLOPT_URL => 'https://test.url.com/api/',
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => '',
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 0,
        CURLOPT_FOLLOWLOCATION => true,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => 'POST',
        CURLOPT_POSTFIELDS => $postfield,
        CURLOPT_HTTPHEADER => array('Content-Type: application/json')
    ));

    $response[] = curl_exec($curl);
    // if you need to know which customer the response was for 
    // use this next line instead, for example
    //$response[$r->customerName] = curl_exec($curl);

    curl_close($curl);
}

// this is now an array of all responses
print_r($responses);