Ich versuche, eine Abfrage an die RSCB PDB-Webdienste zu senden, wie beschrieben here.Anforderungen Bibliothek schlägt fehl, POST ordnungsgemäß, aber urllib erfolgreich [Python]
stelle ich die URL auf, und Abfrage als XML:
import urllib.request as urllib
import requests
url = "http://www.rcsb.org/pdb/rest/search"
queryText = """
<?xml version="1.0" encoding="UTF-8"?>
<orgPdbQuery>
<version>B0907</version>
<queryType>org.pdb.query.simple.ExpTypeQuery</queryType>
<description>Experimental Method Search: Experimental Method=SOLID-STATE NMR</description>
<mvStructure.expMethod.value>SOLID-STATE NMR</mvStructure.expMethod.value>
</orgPdbQuery>
"""
ich dann definieren zwei Möglichkeiten, dieses Posting Daten:
def query_old_fashioned(url, query_xml):
req = urllib.Request(url, data=query_xml.encode())
f = urllib.urlopen(req)
result = f.read()
return result.decode()
def query_with_requests(url, query_xml):
response = requests.post(url, data=query_xml.encode())
return response.text
# result = query_old_fashioned(url, queryText)
# result = query_with_requests(url, queryText)
Mit der ersten Funktion, gutes altmodisches urllib mit .request, bekomme ich das richtige Ergebnis - eine Liste von 4 Zeichenfolgen.
Mit der zweiten Funktion, die, soweit ich sagen kann, macht genau die gleiche Sache, bekomme ich eine JSP-Fehlermeldung HTML zurückgegeben. Dies ist die Fehlermeldung, wenn sie in einem Browser angezeigt:
type Exception report
message
description The server encountered an internal error that prevented it from fulfilling this request.
exception
java.lang.NullPointerException
java.util.StringTokenizer.<init>(StringTokenizer.java:199)
java.util.StringTokenizer.<init>(StringTokenizer.java:221)
org.rcsb.servlet.RestfulServiceServlet.doPost(RestfulServiceServlet.java:1371)
javax.servlet.http.HttpServlet.service(HttpServlet.java:650)
javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:86)
org.pdb.util.web.OutOfServiceFilter.doFilter(OutOfServiceFilter.java:91)
org.pdb.util.web.DOSFilter.doFilter(DOSFilter.java:158)
org.pdb.util.web.AntiRobotFilter.doFilter(AntiRobotFilter.java:29)
org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:176)
org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:145)
org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:92)
org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:394)
note The full stack trace of the root cause is available in the Apache Tomcat/7.0.61 logs.
ich ein wenig JSP weiß, aber ich haven nicht in der Lage gewesen, einen Grund für die POST Versagen von dieser Fehlermeldung aufzulesen, noch ist es mir klar, warum Anforderungen schlägt fehl, aber die Urlib der Standardbibliothek ist erfolgreich. Ich habe sogar versucht, den Quellcode der Requests-Bibliothek auf github durchzugehen, um genau herauszufinden, wie Requests Anfragen erstellen, aber bei diesem Unterfangen war ich nicht erfolgreich.
Diese Python ist 3. Ich traf zuerst dieses Problem mit Ubuntu und haben, da es unter Windows wiedergegeben 10.
Jede mögliche Hilfe würde sehr geschätzt werden.
'application/x-www-form-urlencoded' ist der falsche Inhaltstyp, der dort gesendet werden soll. Die Tatsache, dass der Server es akzeptiert, ist bizarr. Sie * sollten * einen Inhaltstyp 'application/xml' oder' text/xml' senden. –
Ich habe gerade beide ausprobiert und beide scheitern - es gibt keine Fehlermeldung zurück, die es nur an die RSCB-Dokumente für die Webdienste weiterleitet. Du hast Recht, und es ist ein wenig frustrierend, da sie es eines Tages ändern und alles kaputt machen könnten. –
Obwohl bedenken Sie, dass ich technisch eher rohe Bytes als XML-Text sende, wie ich es zuerst kodiere. –