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
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
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.