Autor Zpráva
toredor
Profil
Ahoj,
potřebuji odesílat data pomocí JSON. URL na kterou se data odesílají je zabezpečená jménem a heslem. Může mi někdo poradit jak na to?

Díky
Joker
Profil
toredor:
A v čem konkrétně je problém? „Zabezpečená jménem a heslem“ znamená HTTP autentizaci?
Jan Tvrdík
Profil
$options = [
    'http' => [
        'method'  => 'POST',
        'content' => json_encode($data),
        'header'=> 'Content-Type: application/json',
    ]
];

$context  = stream_context_create($options);
$response = file_get_contents($url, false, $context);
toredor
Profil
Problém mám v tom zabezpečení a je to HTTP autentizace.
blaaablaaa
Profil
Resilo se to tu 6 dni zpatky.

'header'  => "Authorization: Basic " . base64_encode("$username:$password")
toredor
Profil
Moderátor Davex: Následující tři příspěvky byly přesunuty z duplicitního tématu.

Ahoj,
nedávno jsem tady psal o pomoc s odesílání dat pomocí JSON. URL je zabezpečená autorizací. Stále se mi to nedaří. Data odesílám pomocí:
$body = "[{"id": "687", "title": "Jatka fest", "description": "Hudební festival, vystoupí UDG, Visací zámek, Jaroslav Uhlíř, Adam Mišík, The Tap Tap, Tlustá Berta, Hentai Corporation, Memphis, Všichni svatí, Cover trio, Bastards way. Od 10 hodin program pro děti. Předprodej v baru Legenda. Vstupné 239 Kč/299 Kč.", "from": "2014-07-05T10:00:00+02:00", "to": "2014-07-05T23:55:00+02:00", "locale": "cs"}]";

$opts2 = array('http' =>
  array(
    'method'  => 'POST',
    'header'  => "Authorization: Basic ". base64_encode("zamek.api:68fa63a34cc7d"),
    'data' => json_encode($body)
  )
);
$context  = stream_context_create($opts2);
$url = 'http://zamek.stg.eballance.cz/api/events.json';
$result = file_get_contents($url, false, $context, -1, 40000)
Tímto způsobem se nepodaří odeslat. Přes autorizaci projdu, ale data se neuloží protože nejsou ve správném (JSON) formátu. Mám k dospozici skript na vložení dat přes terminál a ten vypadá takto:
curl -XPOST -H "Content-Type: application/json" "http://zamek.stg.eballance.cz/api/events.json" -u "zamek.api:68fa63a34cc7d" -d '
[
  {
    "id": "event-cs-1-id",
    "title": "Nadpis CS EVENT 1",
    "description": "Toto je telo CS EVENT 1. Bah blah blah :)",
        "from": "2014-08-17T19:26:27+02:00",
        "to": "2014-08-21T19:27:27+02:00",
        "locale": "cs"
  },
{
    "id": "event-cs-2-id",
    "title": "Nadpis CS EVENT 2",
    "description": "Toto je telo CS EVENT 2. Bah blah blah :)",
    "from": "2014-08-17T19:26:27+02:00",
    "to": "2014-08-22T19:27:27+02:00",
    "locale": "cs"
  }]

Vidí někdo nějakou chybu nebo má nějakou radu jak by to mělo vypadat?

Díky
Davex
Profil
Obsah proměnné $body zjevně není pole ani řetězec a skript tam skončí na syntaktickou chybu. Funkci json_encode() zpravidla potřebuješ pro konverzi obsahu proměnné do JSON formátu, takže když už máš v proměnné řetězec v JSON, tak jí nepotřebuješ.

$body = '[{"id": "687", "title": "Jatka fest", "description": "Hudební festival, vystoupí UDG, Visací zámek, Jaroslav Uhlíř, Adam Mišík, The Tap Tap, Tlustá Berta, Hentai Corporation, Memphis, Všichni svatí, Cover trio, Bastards way. Od 10 hodin program pro děti. Předprodej v baru Legenda. Vstupné 239 Kč/299 Kč.", "from": "2014-07-05T10:00:00+02:00", "to": "2014-07-05T23:55:00+02:00", "locale": "cs"}]';
toredor
Profil
Skript skončí chybou "failed to open stream: HTTP request failed! HTTP/1.1 500 Internal Server Error" (to je chyba špatného formátu dat, které posílám) výpis $body je jen ukázkou dat, které se snažím odeslat. Vypsal jsem si je pomoci print_r();
Davex
Profil
toredor:
Podívej se ještě jednou, co ti radili Jan Tvrdík [#3] a blaaablaaa [#5]. Asi je potřeba poslat obě HTTP hlavičky Content-Type i Authorization. Kromě toho jsi vytvořil ještě jednu chybu, protože odesílaná data by měla být v jiném prvku pole.
Jan Tvrdík
Profil
Připomenu, že když chceš poslat více HTTP hlaviček, tak je dáš do pole:

$options = [
    'http' => [
        ...
        'header'=> [
            'Content-Type: application/json',
            'Authorization: Basic ' . base64_encode("$username:$password"),
        ],
    ]
];
toredor
Profil
přepsal jsem to podle rad a mám to takto:
$options = [
    'http' => [
        'method'  => 'POST',
        'header'=> ['Content-Type: application/json','Authorization: Basic ' . base64_encode("$username:$password")],
        'content' => json_encode($event)
        ]    
];
$context  = stream_context_create($options);
$response = file_get_contents($url, false, $context);

vypisuje mi to chybu: "Parse error: syntax error, unexpected '[' in script-events.php on line 100"

vidí tam někdo chybu?
Lamicz
Profil
PHP < 5.4 - musíš použít starou array() syntaxi
toredor
Profil
Máte pravdu je tam PHP 5.3. Je nějaká možnost jak to obejít? Díky


přepsal jsem na array() a mám tam chybu: "file_get_contents(): Filename cannot be empty"
toredor
Profil
už to funguje díky za pomoc :-)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: