2011-02-04 9 views
5

私は基本認証を使用して、WebMethodのサーバにHTTPポストにXML文字列をしようとしています。私は、HTTPビルダーの上に座ってRESTプラグインを使用しようとしていました。私は長さが0のレスポンスの結果をいくつか試しました。 Firefoxのポスターを使用して私は全く同じXMLとユーザーの認証を使用しています.WebMethodsの応答はいくつかの追加情報でリクエストをエコーバックするので、下のコードでは間違っています。誰かがXMLのHTTP Postを実行するためのポインタを持っていることを願っています。Groovyの/ Grailsの(RESTプラグインを使用して)HTTP上でXMLを投稿

string orderText = "<item> 
    <item>1</item> 
    <price>136.000000</price> 
</item>" 


def response = withHttp(uri: "https://someserver.net:4433") { 
     auth.basic 'user', 'pass' 

      // have tried body: XmlUtil.serialize(orderText) 
     def r = post(path: '/invoke/document', body: orderText, contentType: XML, requestContentType: XML) 
     { resp, xml -> 
      log.info resp.status 
      log.info resp.data 
      resp.headers.each { 
      log.info "${it.name} : ${it.value}" 
      } 
     } 
    log.info r 
    return r 
} 

ログは言う:ここ

04-02-2011 14:19:39,894 DEBUG HTTPBuilder - Response code: 200; found handler: [email protected] 
04-02-2011 14:19:39,895 INFO HTTPBuilder - Status: 200 
04-02-2011 14:19:39,896 INFO HTTPBuilder - Data: null 
04-02-2011 14:19:39,896 INFO HTTPBuilder - XML: null 
04-02-2011 14:19:39,913 INFO HTTPBuilder - Content-Type : application/EDIINT; charset=UTF-8 
04-02-2011 14:19:39,913 INFO HTTPBuilder - Content-Length : 0 

乾杯、

スティーブ

+0

Groovy HTTPBuilderを経由してもこの作業ができないので、Apache HTTPClientに1つ以上のレイヤーがあり、うまく動作します – Steve

+0

スティーブ、ソリューションとして回答を投稿して受け入れるべきです。私は同じことに取り組んでいる – rochb

+0

あなたのソリューションを投稿することができれば、それは素晴らしいことです。 – Slavko

答えて

4

を私がしてしまったものです。 https://user:[email protected]/etc

Grailsのは、私はRESTをインストールlibフォルダにまたは私の場合、HTTPClientのjarをコピーすることを忘れないでください:それは次のようにあなたは、単にあなたのURLを持つことができ、SSL上の基本的な認証のための一般的なHTTPクライアント

のかなり標準的な使用でありますとにかくHTTPClientを含むプラグイン。

HTTPClientのサイト上での良いドキュメントがあります。http://hc.apache.org/httpcomponents-client-ga/

import org.apache.http.HttpEntity 
import org.apache.http.HttpResponse 
import org.apache.http.client.HttpClient 
import org.apache.http.client.methods.HttpPost 
import org.apache.http.entity.StringEntity 
import org.apache.http.impl.client.DefaultHttpClient 

def sendHttps(String httpUrl, String data) { 
    HttpClient httpClient = new DefaultHttpClient() 
    HttpResponse response 
    try { 
     HttpPost httpPost = new HttpPost(httpUrl) 
     httpPost.setHeader("Content-Type", "text/xml") 

     HttpEntity reqEntity = new StringEntity(data, "UTF-8") 
     reqEntity.setContentType("text/xml") 
     reqEntity.setChunked(true) 

     httpPost.setEntity(reqEntity) 
     log.info "executing request " + httpPost.getRequestLine() 

     response = httpClient.execute(httpPost) 
     HttpEntity resEntity = response.getEntity() 

     log.info response.getStatusLine() 
     if (resEntity != null) { 
      log.with { 
       info "Response content length: " + resEntity.getContentLength() 
       if (isDebugEnabled()) { 
        debug "Response Chunked?: " + resEntity.isChunked() 
        debug "Response Encoding: " + resEntity.contentEncoding 
        debug "Response Content: " + resEntity.content.text 
       } 
      } 
     } 
     // EntityUtils.consume(resEntity); 
    } 
    finally { 
     // When HttpClient instance is no longer needed, 
     // shut down the connection manager to ensure 
     // immediate deallocation of all system resources 
     httpClient.getConnectionManager().shutdown() 
    } 
    return response.getStatusLine() 
} 
1

はこのようにそれを試してみてください。

HTTPBuilder builder = new HTTPBuilder(url) 
builder.request(Method.POST) { 
     // set uriPath, e.g. /rest/resource 
     uri.path = uriPath 

     requestContentType = ContentType.XML 

     // set the xml body, e.g. <xml>...</xml> 
     body = bodyXML 

     // handle response 
     response.success = { HttpResponseDecorator resp, xml -> 
      xmlResult = xml 
     } 
} 
+0

そのおかげで、私は解決策がはるかに洗練されているので、私はそれらの行に沿って何かを試したことを知っている...しかし、その前に、詳細は私を逃れるため...私はContentTypeを使用していないかもしれないと思うので、 .XML – Steve

+0

ザッツそれを行うには、比較的簡単な方法。上記のコードは本当に私を助け、私は2時間と最初に行くのコードの動作上のように貼り付けました。しかし、コンパイルが失敗したときはいつでも、Groovyコンソール内で作業している場合は、スクリプト・コンテキストをクリアする必要があります。 – aamir

0

私はそれは難しいことを成し遂げるために必要はありませんと思い、私は単純なアプローチを使用します(ちなみに余分なプラグインは必要ありません)。だから私はあなたがRESTプラグインを求めているので、これは文脈の外にあるかもしれない知っているが、まだありますので、私はこれを共有したいと思ったのコードの次の部分を考え、そしてもちろん私が認証部に

class YourController{ 
    static allowedMethods = [operation:['POST','GET']] 

    def operation(){ 
     def xmlRequest = request.reader.text 
     println xmlRequest 
     //TODO: XML postprocessing, here you might use XmlParser.ParseText(xmlRequest) 
    } 
} 

をommitingよ別の代替案。

私はwebserviceをテストするために、grails 2.3.2とFirefox RESTClientを使用しています。

関連する問題