2011-02-04 34 views
5

Tôi đang cố gắng HTTP Đăng chuỗi XML lên máy chủ WebMethods bằng cách sử dụng auth cơ bản. Tôi đã cố gắng sử dụng các plugin REST nằm trên đầu trang của HTTP Builder. Tôi đã thử một vài điều tất cả dẫn đến một phản ứng chiều dài 0. Sử dụng Firefox poster Tôi đã sử dụng chính xác XML và người dùng auth và phản hồi WebMethods là để phản hồi lại yêu cầu với một số thông tin bổ sung, vì vậy nó là cái gì tôi đang làm trong đoạn code dưới đây là sai. Hy vọng ai đó có một con trỏ để làm một bài đăng HTTP của XML.Groovy/Grails đăng XML qua HTTP (sử dụng plugin REST) ​​

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 
} 

Logs nói:

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 

Chúc mừng,

Steve

+0

Không thể làm việc này, thậm chí thông qua Groovy HTTPBuilder vì vậy đã đi dưới 1 lớp nữa cho Apache HTTPClient, hoạt động tuyệt vời – Steve

+0

Steve, bạn nên đăng giải pháp của mình làm câu trả lời và chấp nhận nó. – rochb

+0

Tôi đang làm việc trên cùng một điều, nó sẽ là tuyệt vời nếu bạn có thể gửi giải pháp của bạn. – Slavko

Trả lời

4

Đây là những gì tôi đã kết thúc với. Đó là sử dụng khá tiêu chuẩn chung HTTP khách hàng

Đối với auth cơ bản qua SSL bạn chỉ có thể có url của bạn như: https://user:[email protected]/etc

Grails nhớ để sao chép jar HttpClient vào thư mục lib hoặc trong trường hợp của tôi, tôi cài đặt REST plugin bao gồm cả HTTPClient.

Có tài liệu tốt trên trang web 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

thử nó theo cách này:

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

Cảm ơn vì điều đó, tôi biết tôi đã thử một thứ gì đó dọc theo những dòng này vì giải pháp còn sạch hơn ... nhưng một thời gian trước đây để các chi tiết thoát khỏi tôi ... Tôi sẽ xem lại điều này vì tôi nghĩ rằng tôi có thể đã không sử dụng ContentType .XML – Steve

+0

Đó là cách tương đối dễ dàng để thực hiện điều đó. trên mã thực sự giúp tôi, tôi đã bị mắc kẹt như cho 2 giờ và ở trên mã hoạt động trong lần đầu tiên đi. Nhưng một điều tất cả các lọ cần thiết nên có ở đó, và bất cứ khi nào một biên dịch thất bại, bối cảnh kịch bản rõ ràng nếu bạn đang làm việc trong bảng điều khiển groovy. – aamir

0

Tôi đoán không cần để làm cho nó làm điều đó khó khăn, tôi sử dụng một cách tiếp cận đơn giản hơn (bằng cách này bạn không cần thêm plugin). Vì vậy, hãy xem xét đoạn mã tiếp theo, và tất nhiên tôi đang ommiting phần xác thực

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) 
    } 
} 

Tôi biết điều này có thể nằm ngoài ngữ cảnh vì bạn đang yêu cầu plugin REST, nhưng tôi muốn chia sẻ điều này vì có một lựa chọn khác.

Tôi đang sử dụng grails 2.3.2 và Firefox RESTClient để kiểm tra dịch vụ web.

Các vấn đề liên quan