Kdyby/Curl – odeslani souboru (dopisonline)

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
gliny
Člen | 25
+
0
-

Ahoj,
řeším napojení na službu české pošty dopis online a pro uložení zásilky potřebuju odeslat pomocí POST požadavku soubor (nejsem si právě ani jist jestli to poslat jako soubor nebo jako text). Tak jsem si řekl, že bych na to použil Kdyby/Curl.

Podařilo se mi celkem bez problémů rozchodit získání dat ze serveru české pošty (odesláním POST požadavku s username a password).

Nepodařilo se mi uložit zásilku na server české pošty (obnáší to odeslat xml strukturu a v ni je uloženo obsah pdf souboru enkodovan base64). XML strukturu i se zmíněným base64 pdf souborem mam z ukazkoveho příkladu z dokumentace, ale server pošty mi vrací odpověd, že „Proměnná soubor neexistuje“.

Dokumentace ke stažení zde: https://online.postservis.cz/?…

Požadavek má mít následující formát.

Příklad těla požadavku
POST /dopisonline/donApi.php HTTP/1.1
Content-Type: multipart/form-data; boundary=---------------------------8cff83c3391c39b
Host: online3.postservis.cz
Content-Length: 10492
Expect: 100-continue
Connection: Keep-Alive
HTTP/1.1 100 Continue
-----------------------------8cff83c3391c39b
Content-Disposition: form-data; name="user"
dreplech
-----------------------------8cff83c3391c39b
Content-Disposition: form-data; name="password"
dreplech
-----------------------------8cff83c3391c39b
Content-Disposition: form-data; name="soubor"; filename="DopisOnlineNew_1_1.xml"
Content-Type: multipart/form-data
-----------Zde jsou připojena data (XML soubor s base64 pdf)------------
-----------------------------8cff83c3391c39b

Funkční přehled zásilek

$request = new Kdyby\Curl\Request($this->getUrl('prehledZasilek'));
        $request->setCertificationVerify(FALSE);

        $response = $request->post(array(
            'user' => $this->username,
            'password' => $this->password,
            'zasilka' => $zasilka,
            'datum' => $datum
        ));
        $temp = $response->getResponse();

A já prostě nevím jak použít Kdyby/Curl aby mi poslalo takovýhle požadavek.
Děkuji za každou radu, a já to jdu zkusit bez Kdyby/Curl.

Editoval gliny (21. 5. 2015 12:03)

JL
Člen | 24
+
+1
-

Ahoj,

já posílám request tak, že si uložím data do temp XML souboru a ten přiložím:

private function sendRequest($url, $xmlRequest, $identifier = null)
{
        $request = new Request($url);
        $request->headers['Content-Type'] = 'multipart/form-data';

        $data = [
            'user' => $this->username,
            'password' => $this->password,
        ];

        if (!isset($identifier) || !(is_string($identifier))) {
            $identifier = uniqid('letteronline');
        }
        $tempFilePath = $this->tempDir . '/' . $identifier . '.xml';
        $tempFile = fopen($tempFilePath, "w");
        fwrite($tempFile, $xmlRequest);
        fclose($tempFile);

        try {
            $response = $request->post($data, ['soubor' => $tempFilePath]);
            $responseData = $response->getResponse();
            unlink($tempFilePath);
            return $responseData;
        } catch (CurlException $e) {
			// + dalsi catche na jine typy vyjimek, to jsem sem ale nekopiroval
		}
}

Editoval JL (21. 5. 2015 12:08)

gliny
Člen | 25
+
0
-

aha to vypadá zajímavě, po obědě vyzkouším, díky moc.

//funguje to parádně, ještě jednou díky.

Editoval gliny (21. 5. 2015 13:39)

JL
Člen | 24
+
0
-

Fajn, jen ještě přidám poznámku mimo – ISO kód země se bez ohledu na to co píšou v dokumentaci zadává ve dvouznakové alpha-2 verzi.

Editoval JL (2. 6. 2015 11:31)

akadlec
Člen | 1326
+
0
-

Soubor curlem se musí upravit:

$postData = array(
	'foo' => 'bar',
	'file' => new \CURLFile('path/to/file.ext')
);
gliny
Člen | 25
+
0
-

to se musí upravit pokud chceš soubor přidat tím způsobem co jsi poslal ty akadleci, nebo i v případě kdy se soubor přidá tak jak to popsal JL, každopádně JLovo řešení funguje.

JL: Dík za info, beztak, že se bude hodit :)