Avatar billede CRRL Juniormester
05. maj 2020 - 10:12 Der er 1 kommentar og
1 løsning

PHP CURL array

Hey,

Jeg er ved at blive gråhåret over dette..

Er ved at opsætte mailafsendelse via SendGrid API V3

Dokumentation her: https://sendgrid.com/docs/API_Reference/Web_API_v3/Mail/index.html



Skal konvertere følgende CURL til JSON

"{\"personalizations\": [{\"to\": [{\"email\": \"censur@domain.dk\"}]}],\"from\": {\"email\": \"censur@domain.dk\"},\"subject\": \"Hello, World!\",\"content\": [{\"type\": \"text/html\", \"value\": \"Heya!\"}]}");

Har prøvet følgende:

$postFields=array(
  "personalizations" => array("to" => array("email" => "censur@domain.dk")),
  "from" => array("email" => "censur@domain.dk"),
  "subject" => "Hello, World!",
  "content" => array("type" => "text/html", "value" => "Heya"));


Når det bliver sendt via Curl bruger jeg følgende:

curl_setopt($ch, CURLOPT_URL, 'https://api.sendgrid.com/v3/mail/send');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($postFields));

$headers = array();
$headers[] = 'Authorization: Bearer TOTALT HEMMELIG API-KEY';
$headers[] = 'Content-Type: application/json';
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

$result = curl_exec($ch);
if (curl_errno($ch)) {
    echo 'Error:' . curl_error($ch);
}
curl_close($ch);


Jeg får følgende fejl

Array ( [errors] => Array ( [0] => Array ( [message] => Invalid type. Expected: array, given: object. [field] => content [help] => http://sendgrid.com/docs/API_Reference/Web_API_v3/Mail/errors.html#message.content ) [1] => Array ( [message] => Invalid type. Expected: array, given: object. [field] => personalizations [help] => http://sendgrid.com/docs/API_Reference/Web_API_v3/Mail/errors.html#-Personalizations-Errors ) ) )


Nogen idéer til hvad jeg gør galt ? Jeg skal sende det som Array, men kan ikke greje fejlen.
Avatar billede Slater Ekspert
05. maj 2020 - 11:39 #1
Det der forvirrer er nok at arrays og objekter ikke kan direkte oversættes mellem Javascript og PHP. Terminologien er lidt forskellig.

PHP gør forskel på indexed arrays og associative arrays, og objekter er noget helt andet, selvom de direkte kan oversættes til og fra associative arrays.
Javascript (og JSON) har ikke noget koncept af associative arrays, kun indexed arrays og objekter.

Som du kan se i eksemplet for data, skal både "to" og "content" være et array af objekter i JSON:
"to": [
  {
    "email": "john@example.com"
  }
]

i PHP vil det sige det skal pakkes ind i to arrays: ét indexed der indeholder associative arrays.

Dvs. i stedet for:
"to" => array("email" => "censur@domain.dk")
Skal det nok være:
"to" => array(array("email" => "censur@domain.dk"))

Eller bare "to" => [["email" => "censur@domain.dk"]] i mere moderne syntax.
array() er forældet.
- Og samme for content.

Det er sådan for at du kan have flere modtageradresser.
Avatar billede CRRL Juniormester
05. maj 2020 - 14:52 #2
Puha sikke en masse Array's 🥵

Du fik mig dog på rette køl.

Sådan endte min $postFields med at se ud. (Selvom det er en 'forældet' måde at gøre det på 😜)

$postFields=array(
  "personalizations" => array(
  array("to" => array(array("email" => "censur@domain.dk")))
  ),
  "from" => array("email" => "noreply@domain.dk"),
  "subject" => "Hello, World!",
  "content" => array(
  array("type" => "text/html", "value" => "Heya")
)
);
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester