2010-01-26 3 views

Antwort

277

Sie wollen dies:

curl_setopt($process, CURLOPT_USERPWD, $username . ":" . $password); 

Zend hat eine REST-Client und Zend_Http_Client und ich bin sicher, dass PEAR eine Art Wrapper hat. Aber es ist einfach genug, auf eigene Faust zu tun.

So ist die gesamte Anfrage wie folgt aussehen könnte:

$process = curl_init($host); 
curl_setopt($process, CURLOPT_HTTPHEADER, array('Content-Type: application/xml', $additionalHeaders)); 
curl_setopt($process, CURLOPT_HEADER, 1); 
curl_setopt($process, CURLOPT_USERPWD, $username . ":" . $password); 
curl_setopt($process, CURLOPT_TIMEOUT, 30); 
curl_setopt($process, CURLOPT_POST, 1); 
curl_setopt($process, CURLOPT_POSTFIELDS, $payloadName); 
curl_setopt($process, CURLOPT_RETURNTRANSFER, TRUE); 
$return = curl_exec($process); 
curl_close($process); 
+4

Der Zend REST-Client ist hier: http://framework.zend.com/manual/en/zend .rest.client.html –

+1

Cool danke Pekka –

+0

@Pekka - Ihr Link ist kaputt, wie Sie http vermissen: // –

4

Yahoo hat eine Anleitung für Anrufe an ihre REST-Services machen mit PHP:

Make Yahoo! Web Service REST Calls with PHP

Ich habe es selbst nicht verwendet , aber Yahoo ist Yahoo und sollte für mindestens ein gewisses Qualitätsniveau garantieren. Sie scheinen jedoch PUT- und DELETE-Anfragen nicht zu behandeln.

Auch die User Contributed Notes to curl_exec() und andere enthalten viele gute Informationen.

7

Im Gegensatz zu SOAP ist REST kein standardisiertes Protokoll, daher ist es ein bisschen schwierig, einen "REST-Client" zu haben. Da jedoch die meisten RESTful-Dienste HTTP als ihr zugrunde liegendes Protokoll verwenden, sollten Sie in der Lage sein, eine beliebige HTTP-Bibliothek zu verwenden. Zusätzlich zu kräuseln, hat PHP diese über PEAR:

HTTP_Request2

die

HTTP_Request

Eine Probe ersetzt, wie sie es tun HTTP Basic Auth

// This will set credentials for basic auth 
$request = new HTTP_Request2('http://user:[email protected]/secret/'); 

Die auch Unterstützung Digest Auth

// This will set credentials for Digest auth 
$request->setAuth('user', 'password', HTTP_Request2::AUTH_DIGEST); 
+0

Von REST-Client meine ich etwas abstrahiert einige der Low-Level-Details der Verwendung von Curl für http erhalten , post, put, delete usw. was ich tue, indem ich meine eigene PHP-Klasse dazu baue, frage mich, ob jemand das schon getan hat. – blank

+1

Ja, dann könnte HTTP_Request_2 für dich von Interesse sein weg von einer Menge der hässlichsten von cUrl in PHP. Um die Methode, die Sie verwenden, setzen setMethod (HTTP_Request2 :: METHOD_ *). Mit PUT und POSTs, um den Körper der Anfrage, die Sie nur setBody (<< Ihre Xml, Json, usw. Repräsentation hier >>). Authentifizierung oben beschrieben. Es hat auch Abstraktionen für die HTTP-Antwort (etwas, das cUrl wirklich fehlt). – nategood

78

CURLOPT_USERPWD sendet im Grunde die base64 der user:password Zeichenfolge mit HTTP-Header wie folgt:

Authorization: Basic dXNlcjpwYXNzd29yZA== 

Also abgesehen von den CURLOPT_USERPWD Sie auch die HTTP-Request Header Option als auch wie unten mit anderen Header verwenden:

$headers = array(
    'Content-Type:application/json', 
    'Authorization: Basic '. base64_encode("user:password") // <--- 
); 
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
+0

Vielen Dank, Sabuj. – frops

+0

Diese Methode der Übergabe eines benutzerdefinierten Auth-Header statt die Verwendung von 'CURLOPT_USERPWD' hat für mich funktioniert. – aalaap

23

Die einfachste und nativste Art, CURL direkt zu verwenden.

Dies funktioniert für mich:

<?php 
$login = 'login'; 
$password = 'password'; 
$url = 'http://your.url'; 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL,$url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); 
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); 
curl_setopt($ch, CURLOPT_USERPWD, "$login:$password"); 
$result = curl_exec($ch); 
curl_close($ch); 
echo($result); 
+0

Sehr hilfreiche Antwort, danke. –

+0

Dieser hat funktioniert, OK! +1 –

+0

Ja, das ist einfach und auf den Punkt. ich liebe es –

2

Michael Dowling ist sehr aktiv gepflegt Guzzle ist ein guter Weg zu gehen. Neben der eleganten Oberfläche, asynchrone Berufung und PSR-Compliance, macht es die Authentifizierung Header für REST tot einfach Anrufe:

// Create a client with a base URL 
$client = new GuzzleHttp\Client(['base_url' => 'http://myservices.io']); 

// Send a request to http://myservices.io/status with basic authentication 
$response = $client->get('/status', ['auth' => ['username', 'password']]); 

the docs See.

0

Wenn der Autorisierungstyp Grund Auth und die Daten werden json gepostet dann wie tun diese

<?php 

$data = array("username" => "test"); // data u want to post                 
$data_string = json_encode($data);                     
$api_key = "your_api_key"; 
$password = "xxxxxx";                             
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, "https://xxxxxxxxxxxxxxxxxxxxxxx");  
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20); 
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); 
curl_setopt($ch, CURLOPT_POST, true);                 
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);                 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  
curl_setopt($ch, CURLOPT_USERPWD, $api_key.':'.$password); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array( 
    'Accept: application/json', 
    'Content-Type: application/json')               
);    

if(curl_exec($ch) === false) 
{ 
    echo 'Curl error: ' . curl_error($ch); 
}                          
$errors = curl_error($ch);                            
$result = curl_exec($ch); 
$returnCode = (int)curl_getinfo($ch, CURLINFO_HTTP_CODE); 
curl_close($ch); 
echo $returnCode; 
var_dump($errors); 
print_r(json_decode($result, true)); 
Verwandte Themen