Heim >php教程 >PHP开发 >Analyse des 400-Fehlers in PHP mit Curl zum Initiieren einer HTTP-Anfrage

Analyse des 400-Fehlers in PHP mit Curl zum Initiieren einer HTTP-Anfrage

巴扎黑
巴扎黑Original
2016-11-07 10:04:0413958Durchsuche

Zusammenfassung: Wenn in einer HTTP-Anfrage ein 400-Fehler auftritt, wird dies normalerweise durch eine ungültige http-Anfrage (fehlerhafte Anfrage) und ein falsches URL-Parameter-Codierungsformat verursacht. Für die URL gelten bestimmte Formatanforderungen. Im Allgemeinen können nur englische Buchstaben, arabische Ziffern und einige Sonderzeichen wie Leerzeichen und Anführungszeichen verwendet werden, bevor die URL verwendet werden kann. 1. Beim direkten Zugriff im Browser führt der Browser automatisch eine Codierungsverarbeitung durch. 2. Beim direkten Aufruf im Programm muss die URL jedoch vorab codiert werden. Wenn beispielsweise PHP mit curl_exec aufgerufen wird, werden unzulässige Zeichen wie z da Leerzeichen kodiert werden müssen. 3. Insbesondere müssen Sie dem im URL-Parameter enthaltenen JSON-Datenwert mehr Aufmerksamkeit schenken.

Hintergrund

Phänomen 1 – Die PHP-gekapselte HTTP-Anforderungsschnittstelle ruft den Rawheader der URL auf

Analyse des 400-Fehlers in PHP mit Curl zum Initiieren einer HTTP-Anfrage

1. Antwort Der Wert zeigt 400 Fehler

HTTP/1.1 400 Unknown VersionServer: Tengine/2.0.3Date: Tue, 19 Jul 2016 07:38:15 GMTContent-Length: 0Connection: keep-alive

2. Selbstgekapselte HTTP-Anfrageschnittstelle

/**
* 发送httpful get请求
* @param  [array] $params [description]
* @return [object]         [description]
*/public  function sendGetRequest($serverUrl,$params){    try{
        $str_params = '';        foreach ($params as $key => $value) {
            $str_params .= "&$key=".$value;
        }
        $response =  \Httpful\Request::get($serverUrl.$str_params)->send();        return  $response->body;
    }catch(Execption $e){        return array("statuscode"=>'-1',"message"=>'服务器出错了');
    }
}

3. Die Sendemethode des von Request.php gekapselten Request-Objekts

nategood Die Methode Request::send in /httpful verwendet die PHP-Schnittstelle „curl_exec“, um eine http-Anfrage zu initiieren.

/**
* Actually send off the request, and parse the response
* @return string|associative array of parsed results
* @throws ConnectionErrorException when unable to parse or communicate w server
*/public function send(){    if (!$this->hasBeenInitialized())        $this->_curlPrep();
    $result = curl_exec($this->_ch);    if ($result === false) {        if ($curlErrorNumber = curl_errno($this->_ch)) {
            $curlErrorString = curl_error($this->_ch);            $this->_error($curlErrorString);            throw new ConnectionErrorException('Unable to connect: ' . $curlErrorNumber . ' ' . $curlErrorString);
        }        $this->_error('Unable to connect.');        throw new ConnectionErrorException('Unable to connect.');
    }
    $info = curl_getinfo($this->_ch);    // Remove the "HTTP/1.x 200 Connection established" string and any other headers added by proxy
    $proxy_regex = "/HTTP\/1\.[01] 200 Connection established.*?\r\n\r\n/s";    if ($this->hasProxy() && preg_match($proxy_regex, $result)) {
        $result = preg_replace($proxy_regex, '', $result);
    }
    $response = explode("\r\n\r\n", $result, 2 + $info['redirect_count']);
    $body = array_pop($response);
    $headers = array_pop($response);
    curl_close($this->_ch);    return new Response($body, $headers, $this, $info);
}

4. Der URL-Wert vor curl_exec heißt

http://192.168.59.146/api?version=1.0&format=json&appkey=KtSNKxk3&access_token=changyanyun&method=pan.file.export&uid=3062000039000412278&fileId=3aaaa5c8-3eaa-4511-91e7-46831d418f10&fileIndex={"lifecycle":{"auditstatus":"0"},"general":{"source":"UGC","creator":"\u6559\u5e080523","uploader":"gsres_iflytek_f968bca78360d38abcbaf23a5a318b12","extension":"ppt","title":"Unit12 What did you do last weekdend\u8bfe\u65f64\uff081\uff09"},"properties":{"subject":["01"],"edition":["01"],"stage":["010001"],"book":["01010101-001"],"unit":["01"],"course":[""],"unit1":["01"],"unit2":[""],"unit3":[""],"phase":["03"],"type":["0100"],"rrtlevel1":["08"]}}

Phänomen 2 – Direkter Zugriff auf die URL im Browser

Analyse des 400-Fehlers in PHP mit Curl zum Initiieren einer HTTP-Anfrage

http://192.168.59.146/api?version=1.0&format=json&appkey=KtSNKxk3&access_token=changyanyun&method=pan.file.export&uid=3062000039000412278&fileId=3aaaa5c8-3eaa-4511-91e7-46831d418f10&fileIndex={ %22lifecycle%22:{ %22auditstatus%22:%220%22},%22general%22:{ %22source%22:%22UGC%22,%22creator%22:%22\u6559\u5e080523%22,%22uploader%22:%22gsres_iflytek_f968bca78360d38abcbaf23a5a318b12%22,%22extension%22:%22ppt%22,%22title%22:%22Unit12%20What%20did%20you%20do%20last%20weekdend\u8bfe\u65f64\uff081\uff09%22},%22properties%22:{ %22subject%22:[%2201%22],%22edition%22:[%2201%22],%22stage%22:[%22010001%22],%22book%22:[%2201010101-001%22],%22unit%22:[%2202%22],%22course%22:[%22%22],%22unit1%22:[%2202%22],%22unit2%22:[%22%22],%22unit3%22:[%22%22],%22phase%22:[%2203%22],%22type%22:[%220100%22],%22rrtlevel1%22:[%2208%22]}}

Ursachenanalyse

Beim Vergleich der URL-Werte in Phänomen 1 und Phänomen 2 können wir Folgendes feststellen:

Der Parameterwert „fileIndex“ ist eine JSON-Zeichenfolge

Das Titelattribut im fileIndex-Parameterwert Das Leerzeichen im Wert wird wie in Phänomen 2 codiert, und das doppelte Anführungszeichen „wird codiert als“. Dieser Vorgang wird vom Browser automatisch ausgeführt

Nach der Codierung des Leerzeichens In der URL gibt die Schnittstelle „curl_exec“ 200 zurück

Testcode

_ch)) {
        $curlErrorString = curl_error($this->_ch);        $this->_error($curlErrorString);        throw new ConnectionErrorException('Unable to connect: ' . $curlErrorNumber . ' ' . $curlErrorString);
    }    $this->_error('Unable to connect.');    throw new ConnectionErrorException('Unable to connect.');
}
var_dump("ch");
var_dump($ch);
$info = curl_getinfo($ch);
var_dump("info");
var_dump($info);// Remove the "HTTP/1.x 200 Connection established" string and any other headers added by proxy$proxy_regex = "/HTTP\/1\.[01] 200 Connection established.*?\r\n\r\n/s";if (preg_match($proxy_regex, $result)) {
    $result = preg_replace($proxy_regex, '', $result);
}
$response = explode("\r\n\r\n", $result, 2 + $info['redirect_count']);
var_dump("response");
var_dump($response);
$body = array_pop($response);
var_dump("body");
var_dump($body);
$headers = array_pop($response);
var_dump("headers");
var_dump($headers);// 关闭cURL资源,并且释放系统资源curl_close($ch);?>

Prozentkodierung (d. h. URL-Kodierung)

Im Allgemeinen können URLs nur englische Buchstaben und Arabisch verwenden Ziffern und bestimmte Satzzeichen Sie können keine anderen Wörter und Symbole verwenden. Ruan Yifeng erwähnte in seinem Blog-Beitrag, dass der Netzwerkstandard RFC 1738 verbindliche Bestimmungen vorsieht: „...Nur alphanumerische Zeichen [0-9a-zA-Z], die Sonderzeichen „$-!*“. (),“ [ohne Anführungszeichen – ed], und reservierte Zeichen, die für ihre reservierten Zwecke verwendet werden, dürfen innerhalb einer URL unverschlüsselt verwendet werden.“

„Nur Buchstaben und Zahlen [0-9a-zA-Z], einige The Sonderzeichen „$-. !*'()“, [doppelte Anführungszeichen ausgenommen] und bestimmte reservierte Wörter können direkt in URLs ohne Kodierung verwendet werden „


URL-Kodierung ist die Vereinheitlichung eines bestimmten Kontexts. Die Kodierungsmechanismus des Ressourcen-Locators (URL). Wenn der Server beim Parsen der HTTP-Anfrage auf nicht standardmäßige Zeichen stößt, kodiert er die nicht standardmäßigen Zeichen

Zusammenfassung

Wenn ein 400-Fehler auftritt Die http-Anfrage wird normalerweise durch eine ungültige http-Anfrage (schlechte Anfrage) und ein falsches URL-Parameter-Kodierungsformat verursacht. Für die URL gelten bestimmte Formatanforderungen. Im Allgemeinen können nur englische Buchstaben, arabische Ziffern und einige Sonderzeichen verwendet werden. Andere Zeichen wie Leerzeichen und doppelte Anführungszeichen müssen codiert werden, bevor die URL verwendet werden kann.

Beim direkten Zugriff im Browser wird der Browser die URL automatisch kodieren.

Beim direkten Aufruf im Programm muss die URL jedoch vorab kodiert werden, wenn beispielsweise PHP mit „curl_exec“ aufgerufen wird , Leerzeichen müssen kodiert werden. Warten Sie, bis unzulässige Zeichen kodiert sind.

Besonders wenn URL-Parameter JSON-Datenwerte enthalten, müssen Sie mehr Aufmerksamkeit schenken.

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:MySQL LIST-PartitionNächster Artikel:MySQL LIST-Partition