2016-07-17 16 views
0

Ich mache einen Port von einer funktionierenden C# -Klasse zu einer PHP-Klasse Ich versuche eine sehr einfache Aufgabe, aber die Leistung ist anders und ich kann nicht finden Problem, vielleicht können Sie mir helfen.PHP cURL Ausgaben ... Fehler 401

Dies ist der C# -Code (nicht von mir, arbeiten wie es ist, sensible Daten versteckt):

 Stream requestStream = null; 
     HttpWebRequest webRequest = null; 
     StringBuilder postBuilder = null; 
     HttpWebResponse webResponse = null; 
     string requestUrl = null; 
     string cookieString = null; 
     byte[] rawPostData = null; 

     requestUrl = "https://some_server/Login"; 
     webRequest = (HttpWebRequest)HttpWebRequest.Create(requestUrl); 
     postBuilder = new StringBuilder(); 

     postBuilder.Append("<?xml version=\"1.0\" ?>"); 
     postBuilder.Append("<authorization>"); 
     postBuilder.Append("<username><![CDATA[some_name]]></username>"); 
     postBuilder.Append("<password><![CDATA[some_password]]></password>"); 
     postBuilder.Append("<domain><![CDATA[some_domain]]></domain>"); 
     postBuilder.Append("</authorization>"); 

     rawPostData = Encoding.Default.GetBytes(postBuilder.ToString()); 

     webRequest.ContentType = "text/xml"; 
     webRequest.Accept = "*/*,text/xml"; 
     webRequest.ContentLength = rawPostData.Length; 
     webRequest.Method = "POST"; 
     webRequest.UserAgent = "dsaxess/special"; 

     requestStream = webRequest.GetRequestStream(); 
     requestStream.Write(rawPostData, 0, rawPostData.Length); 
     requestStream.Flush(); 


     webResponse = (HttpWebResponse)webRequest.GetResponse(); 
     Debug.WriteLine("Status: " + webResponse.StatusCode); 
     //Debug.Write(webRequest.Headers); 
     //Debug.Write(webResponse.Headers); 
     requestStream.Close(); 
     requestStream = null; 
     postBuilder = null; 

     Debug.WriteLine("Done!"); 

Das ist mein PHP-Code:

$ch = curl_init(); 
    $url = "https://some_server/Login"; 
    $host = parse_url($url, PHP_URL_HOST); 
    //$path = parse_url($url, PHP_URL_PATH); 

    $xml_data = "<?xml version='1.0' ?>". 
       "<authorization>". 
       "<username><![CDATA[some_name]]></username>". 
       "<password><![CDATA[some_password]]></password>". 
       "<domain><![CDATA[some_domain]]></domain>". 
       "</authorization>"; 

    $headers = array(
      "Content-type: text/xml", 
      "Accept: */*,text/xml", 
      "User-Agent: dsaxess/special", 
      "Host: ".$host, 
      "Content-length: ".strlen($xml_data), 
      "Expect: 100-continue", 
      "Connection: Keep-Alive" 
    ); 

    //var_dump($headers); 
    //var_dump($xml_data); 

    curl_setopt($ch, CURLOPT_URL,$url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch,CURLOPT_BINARYTRANSFER,true); 

    curl_setopt($ch, CURLOPT_HEADER, true); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 

    curl_setopt($ch, CURLOPT_POST, true); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $xml_data); 

    $data = curl_exec($ch); 

    if (curl_errno($ch)) { 
     print "Error: " . curl_error($ch); 
    } else { 
     var_dump(curl_getinfo($ch,CURLINFO_HTTP_CODE)); 
     //var_dump($data); 
     curl_close($ch); 
    } 

C# -Code geben Der Status OK und eine gültige Authentifizierungs-Token. PHP-Code geben Status 401 und Fehler: Benutzer existiert nicht.

Ich kann nicht sagen, warum ist anders. Ich habe die Anfrage und Antwort Header auf beiden verglichen und alles sieht gleich aus.

Bitte helfen.

Antwort

2

Ich löste es selbst. Header-Syntax war falsch. Die korrekte Syntax lautet:

$headers = array(
      "Content-type" => "text/xml", 
      "Accept" => "*/*,text/xml", 
      "User-Agent" => "dsaxess/special", 
      "Host" => $host, 
      "Content-length" => strlen($xml_data), 
      "Expect" => "100-continue", 
      "Connection" => "Keep-Alive" 
    );