2012-11-19 26 views
18

Trong Scala làm thế nào để xây dựng một URL với các tham số chuỗi truy vấn theo lập trình?Scala - URL với chuỗi phân tích cú pháp và trình tạo DSL

Ngoài ra làm cách nào để phân tích cú pháp String chứa URL có tham số chuỗi truy vấn vào cấu trúc cho phép tôi chỉnh sửa thông số chuỗi truy vấn theo lập trình?

Trả lời

13

Thư viện sau đây có thể giúp bạn phân tích và xây dựng các URL với các thông số chuỗi truy vấn (Disclaimer: Đây là thư viện của riêng tôi): https://github.com/lemonlabsuk/scala-uri

Nó cung cấp một DSL cho việc xây dựng các URL với chuỗi truy vấn:

val uri = "http://example.com" ? ("one" -> 1) & ("two" -> 2) 

Bạn có thể phân tích một uri và nhận được các thông số vào một Map[String,List[String]] như vậy:

val uri = parseUri("http://example.com?one=1&two=2").query.params 
4

thư viện Theon của trông khá n Nước đá. Nhưng nếu bạn chỉ muốn có một phương thức mã hóa nhanh, tôi có cái này. Nó đề với các tham số tùy chọn, và cũng sẽ nhận ra JsValues ​​từ spray-json và in gọn chúng trước khi mã hóa. (Những xảy ra được hai điều tôi phải lo lắng về, nhưng bạn có thể dễ dàng mở rộng khối phù hợp cho các trường hợp khác mà bạn muốn cung cấp cho xử lý đặc biệt để)

import java.net.URLEncoder 
def buildEncodedQueryString(params: Map[String, Any]): String = { 
    val encoded = for { 
    (name, value) <- params if value != None 
    encodedValue = value match { 
     case Some(x:JsValue) => URLEncoder.encode(x.compactPrint, "UTF8") 
     case x:JsValue  => URLEncoder.encode(x.compactPrint, "UTF8") 
     case Some(x)   => URLEncoder.encode(x.toString, "UTF8") 
     case x    => URLEncoder.encode(x.toString, "UTF8") 
    } 
    } yield name + "=" + encodedValue 

    encoded.mkString("?", "&", "") 
} 
15

Spray có rất efficient URI parser. Cách sử dụng như sau:

import spray.http.Uri 
val uri = Uri("http://example.com/test?param=param") 

Bạn có thể thiết lập các params truy vấn như vậy:

uri withQuery ("param2" -> "2", "param3" -> 3") 
+0

Có cách nào để sử dụng bên ngoài này phun? Nhìn vào nguồn có vẻ như nó khá giống với các phần phun khác. – Falmarri

+0

Bạn chỉ cần mô-đun ['spray-http'] (http://spray.io/documentation/1.2.0/spray-http/) khá nhỏ. Nó chỉ chứa mô hình cho các yêu cầu và phản hồi HTTP. Nó không chứa bất kỳ mã máy chủ hoặc máy khách nào. – theon

+0

@theon làm cách nào để sử dụng tính năng Định tuyến Phun này? Đây là mã của tôi yêu cầu val: HttpRequest = Nhận (api) đường ống val: Tương lai [SendReceive] = { cho { Http.HostConnectorInfo (connector, _) <- IO (Http)? Http.HostConnectorSetup (AppnexusSegmentService.AppnexusBaseUrl) } suất sendReceive (connector) } Await.result (pipeline.flatMap {client => client.apply (theo yêu cầu)}, 15.seconds) – Anand

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