Skip to content


Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Simple HTTP Client, wraps Apache HttpClient 4.0 to provide an easy to use Scala API
Java Scala
tree: 7374212d21

Fetching latest commit…

Cannot retrieve the latest commit at this time

Failed to load latest commit information.


Simple HTTP Client

Wraps Apache HttpClient 4.0 to provide an easy to use Scala API. Java users have some benefits as well.

Copyright © 2009, Erkki Lindpere
All rights reserved.

This software is distributed under the MIT license. See the file License.txt for the full text.

The project name shttpc is pronounced like ShittyPC.

A Maven repository at contains both sources and binaries.

Maven note: you will have to add SHTTPC’s optional Maven dependencies to your own POM, they won’t get transitively resolved (they are marked optional because it’s annoying to transitively get a bunch of libraries that you don’t need)

Usage examples (Scala)

GET with params Map, comprehensions with NekoHTML parsed to Scala’s XML Nodes

import org.villane.shttpc._

object MetacriticTest {
  val http = new Http

  case class Result(name: String, url: String, score: Int)
  def feelingLucky(query: String) = {
    val html = http.get("" ? Map(
      "sort" -> "relevance",
      "termtype" -> "all",
      "ts" -> query,
      "ty" -> "0"

    val res = for {
      div <- html \ "body" \ "div"
      if (div \ "@id" == "pagecontainer")
      col <- div \ "div" \ "table" \ "tbody" \ "tr" \ "td"
      if (col \ "@id" == "rightcolumn")
      p <- col \ "p"
      if (p.text.startsWith("1."))
    } yield p

    Result(res \ "a" text, res \ "a" \ "@href" text, (res \ "span" text).toInt)

  def main(sgra: Array[String]) = {
    println(feelingLucky("Brutal Legend").score)

Alternate comprehension with SHTTPC’s XPath support

Note that XPath support is very limited, basically only expressions like the one below are supported.

	import BetterXPath._
    val res = for {
      p <- html / "body/div[@id='pagecontainer']/div/table/tbody/tr/td[@id='rightcolumn']/p"
      if (p.text.startsWith("1."))
    } yield p

Usage Examples (Java)

Similar Example to the above, but in Java.

import org.villane.shttpc.Http;
import org.villane.shttpc.IterableNodeList;
import org.villane.shttpc.SimpleHttpResponse;
import org.villane.shttpc.SimpleXPath;
import org.w3c.dom.Document;
import org.w3c.dom.Node;

public class MetacriticTestJava {

	public static class Result {
		public final String name;
		public final String url;
		public final Integer score;

		public Result(String name, String url, Integer score) { = name;
			this.url = url;
			this.score = score;

	public static Result feelingLucky(String query) throws Exception {
		Http http = new Http();
		SimpleHttpResponse response = http.get(	""
				+ "?sort=relevance&termtype=all&ts={}&ty=0", query);
		Document html = response.asDomHtml();
		IterableNodeList ps = SimpleXPath.evalNodeList(html,
		Node p = null;
		for (Node node : ps) {
			if (node.getTextContent().startsWith("1.")) {
				p = node;
		return new Result(
				SimpleXPath.evalNode(p, "A").getTextContent(),
				SimpleXPath.evalString(p, "A/@href"),
				SimpleXPath.evalNumber(p, "SPAN/text()").intValue()

	public static void main(String[] args) throws Exception {
		System.out.println(feelingLucky("Brutal Legend").score);
Something went wrong with that request. Please try again.