2016-05-14 23 views
0

(首先,請多多包涵,這是利用各自的技術我第一次,也許這是一個非常簡單的錯誤)錯誤在EXPath HTTP使用<http:body>客戶


更新:我「M改寫了一個問題,我更瞭解現在的問題,這個問題顯然是在EXPath側...


我試圖讓使用XSLT + EXPath HTTP客戶談了一個客戶端到服務器,但我無法得到combinati在POST + <http:body>上工作...

以下大部分來自真實示例代碼,但要找到直接適用的示例並不容易。

這裏有一些ressources我用:

http://expath.org/modules/http-client/

http://expath.org/modules/http-client/samples

http://expath.org/spec/http-client

http://www.ibm.com/developerworks/library/x-expath/

我使用expath-http-client-saxon-0.12.0,順便說一句。

下面是來自客戶端的代碼:

<?xml version="1.0" encoding="UTF-8"?> 

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:xs="http://www.w3.org/2001/XMLSchema" 
       xmlns:http="http://expath.org/ns/http-client" 
       xmlns:h="http://www.w3.org/1999/xhtml" 
       exclude-result-prefixes="#all" 
       version="2.0"> 

    <xsl:import href="http://expath.org/ns/http-client.xsl"/> 

    <xsl:output indent="yes"/> 

    <xsl:template name="main" match="/"> 
     <root> 
     <!-- the request element --> 
     <xsl:variable name="request" as="element(http:request)"> 
      <http:request method="post" href="http://127.0.0.1:8888/test"> 
       <http:body media-type="application/xml"/> 
      </http:request> 
     </xsl:variable> 
     <xsl:variable name="body" as="element()"> 
      <x>1</x> 
     </xsl:variable> 
     <!-- sending the request --> 
     <xsl:variable name="resp" select="http:send-request($request,(),$body)"/> 
     <!-- add the http:response element to the output tree --> 
     <xsl:sequence select="$resp[1]"/> 
     </root> 
    </xsl:template> 

</xsl:stylesheet> 

請原諒我,如果有些東西是多餘的,我想一個真正的大量的這種變種。

我試圖用@MartinHonnen建議測試發送與提琴手的請求。

如果我打電話與

saxon -xsl:post-example.xsl -it:main 

客戶端,然後我得到的消息

May 15, 2016 10:53:42 AM org.expath.pkg.repo.tools.Logger info 
INFO: Create a new repository with storage: File system storage in /usr/share/expath/repo 
No license file found - running with licensable features disabled 
2016/05/15 10:53:42:496 CEST [INFO] DefaultHttpClient - I/O exception (java.io.IOException) caught when processing request to {}->http://127.0.0.1:8888: Error serializing the body content 
2016/05/15 10:53:42:499 CEST [INFO] DefaultHttpClient - Retrying request to {}->http://127.0.0.1:8888 
2016/05/15 10:53:42:499 CEST [INFO] DefaultHttpClient - I/O exception (java.io.IOException) caught when processing request to {}->http://127.0.0.1:8888: Error serializing the body content 
2016/05/15 10:53:42:500 CEST [INFO] DefaultHttpClient - Retrying request to {}->http://127.0.0.1:8888 
2016/05/15 10:53:42:500 CEST [INFO] DefaultHttpClient - I/O exception (java.io.IOException) caught when processing request to {}->http://127.0.0.1:8888: Error serializing the body content 
2016/05/15 10:53:42:500 CEST [INFO] DefaultHttpClient - Retrying request to {}->http://127.0.0.1:8888 
Error on line 18 of post-example.xsl: 
    Error sending the HTTP request 
Error sending the HTTP request 

我試圖瞭解如何配置序列化,但它是非常複雜的,我真的不認爲默認值不應該導致這種簡單情況下的問題?

提琴手錶明這一點:

POST /test HTTP/1.1 
Content-Type: application/xml; charset=UTF-8 
Transfer-Encoding: chunked 
Host: 127.0.0.1:8888 
Connection: Keep-Alive 
User-Agent: Apache-HttpClient/4.5.1 (Java/1.7.0_101) 

,但正文內容。

這也給了形式

96 Failed to obtain request body. System.IO.InvalidDataException Bad request: Chunked Body was missing entirely. 

我也嘗試過如此衆多的信息,具有相同的結果:

<?xml version="1.0" encoding="UTF-8"?> 

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:xs="http://www.w3.org/2001/XMLSchema" 
       xmlns:http="http://expath.org/ns/http-client" 
       xmlns:h="http://www.w3.org/1999/xhtml" 
       exclude-result-prefixes="#all" 
       version="2.0"> 

    <xsl:import href="http://expath.org/ns/http-client.xsl"/> 

    <xsl:output indent="yes"/> 

    <xsl:template name="main" match="/"> 
     <root> 
     <!-- the request element --> 
     <xsl:variable name="request" as="element(http:request)"> 
      <http:request method="post" href="http://127.0.0.1:8888/test"> 
      <http:body media-type="text/plain">foo</http:body> 
      </http:request> 
     </xsl:variable> 
     <!-- sending the request --> 
     <xsl:variable name="resp" select="http:send-request($request)"/> 
     <!-- add the http:response element to the output tree --> 
     <xsl:sequence select="$resp[1]"/> 
     </root> 
    </xsl:template> 

</xsl:stylesheet> 

我如何找出什麼錯誤? PS:如果有人可以推薦另一種工具來將XSLT(Saxon)與REST API接口,我很樂意聽到它。

+1

我對這些工具並不熟悉,但是如果你有一個像curl這樣的工具做正確的事情,那麼也許作爲一個調試步驟,它有助於使用像fiddler這樣的工具來比較使用curl和expath時交換的HTTP請求和響應。 –

+0

@MartinHonnen感謝您的建議。如果我正確地解釋了結果,請求中沒有主體('Content-Length:0')這仍然引發問題,我在http請求的主體聲明中做錯了什麼... –

回答

0

答案似乎很簡單:使用expath-http-client-saxon-0.11.0

的建議從亞當Retter過來的

https://groups.google.com/forum/#!forum/expath

與該版本它的工作原理。

因此它似乎版本0.12.0被打破(目前)。