{"id":48680787,"url":"https://github.com/m3dev/curly","last_synced_at":"2026-04-26T20:00:40.861Z","repository":{"id":5166739,"uuid":"6337479","full_name":"m3dev/curly","owner":"m3dev","description":"A pretty simple HTTP client as handy as `curl` command","archived":true,"fork":false,"pushed_at":"2016-11-12T01:03:45.000Z","size":92,"stargazers_count":43,"open_issues_count":1,"forks_count":12,"subscribers_count":62,"default_branch":"develop","last_synced_at":"2025-12-16T13:30:29.698Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":"openproject/AndroidDigest","license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/m3dev.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2012-10-22T15:32:16.000Z","updated_at":"2025-08-27T14:23:32.000Z","dependencies_parsed_at":"2022-07-06T08:30:09.780Z","dependency_job_id":null,"html_url":"https://github.com/m3dev/curly","commit_stats":null,"previous_names":[],"tags_count":13,"template":false,"template_full_name":null,"purl":"pkg:github/m3dev/curly","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/m3dev%2Fcurly","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/m3dev%2Fcurly/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/m3dev%2Fcurly/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/m3dev%2Fcurly/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/m3dev","download_url":"https://codeload.github.com/m3dev/curly/tar.gz/refs/heads/develop","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/m3dev%2Fcurly/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32310804,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-26T19:15:34.056Z","status":"ssl_error","status_checked_at":"2026-04-26T19:15:15.467Z","response_time":129,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-04-11T01:00:36.064Z","updated_at":"2026-04-26T20:00:40.852Z","avatar_url":"https://github.com/m3dev.png","language":"Java","funding_links":[],"categories":["网络编程"],"sub_categories":["Spring Cloud框架"],"readme":"# Curly HTTP Client\n\n`Curly` is a pretty simple HTTP client as handy as `curl` command.\n\n[![Build Status](https://travis-ci.org/m3dev/curly.svg?branch=develop)](https://travis-ci.org/m3dev/curly)\n\n## Getting Started\n\n### Java via Maven\n\n```xml\n\u003cdependencies\u003e\n  \u003cdependency\u003e\n    \u003cgroupId\u003ecom.m3\u003c/groupId\u003e\n    \u003cartifactId\u003ecurly\u003c/artifactId\u003e\n    \u003cversion\u003e[0.5,)\u003c/version\u003e\n  \u003c/dependency\u003e\n\u003c/dependencies\u003e\n```\n\n### Scala via xsbt\n\n```scala\nlibraryDependencies += \"com.m3\" %% \"curly-scala\" % \"0.5.+\"\n```\n\n### Groovy via Grape\n\n```groovy\n@Grab('com.m3:curly:[0.5,)')\n```\n\n## Java Usage\n\n### GET\n\nThe following code is an example of sending a GET request.\n\n```java\nimport com.m3.curly.*;\nResponse response = HTTP.get(\"http://example.com/\");\n// or HTTP.get(new Request(\"http://example.com/\"));\n\nresponse.getStatus()   // -\u003e int : 200\nresponse.getHeaders()  // -\u003e Map\u003cString, String\u003e : {null=HTTP/1.1 200 OK, ETag=\"33414 ...\nresponse.getHeaderFields()  // -\u003e Map\u003cString, List\u003cString\u003e\u003e : {null=[HTTP/1.1 200 OK], ETag=[\"33414 ...\nresponse.getBody()     // -\u003e byte[] : ....\nresponse.getTextBody() // -\u003e String : \"\u003chtml\u003e\u003chead\u003e...\"\n```\n\nIt's also possible to append the query string.\n\n```java\nRequest request = new Request(\"http://example.com/?name=Andy\").addQueryParam(\"age\", 20);\n````\n\nThe default value for \"Accept-Charset\" is \"UTF-8\". Needless to say, it's possible to specify other encoding values.\n\n```java\nRequest request = new Request(\"http://example.com/\", \"EUC-JP\");\n```\n\nor\n\n```java\nRequest request = new Request(\"http://example.com/\");\nrequest.setCharset(\"EUC-JP\");\n```\n\nIt's also possible to overwrite other headerFields.\n\n```java\nrequest.setHeader(\"Authorization\", \"OAuth oauth_consumer_key=...\")\n```\n\n### POST\n\nThe following code is an example of sending a POST request.\n\n```java\nMap\u003cString, Object\u003e formParams = new HashMap\u003cString, Object\u003e();\nformParams.put(\"name\", \"Andy\");\nformParams.put(\"age\", 20);\nformParams.put(\"multi\", new String[] { \"value1\", \"value2\" }); // array or Iterable\n\nResponse response = HTTP.post(\"http://example.com/register\", formParams);\n// or HTTP.post(new Request(\"http://example.com/register\", formParams));\n```\n\n\"multipart/form-data\" is also available.\n\n```java\nList\u003cFormData\u003e data = new ArrayList\u003cFormData\u003e();\ndata.add(new FormData(\"name\", new TextInput(\"Andy\", \"UTF-8\")));\ndata.add(new FormData(\"image\", new FileInput(new File(\"./myface.jpg\"), \"myface.jpg\"), \"image/jpeg\"));\nRequest request = new Request(\"http://example.com/register\");\nrequest.setMultipartFormData(data);\nResponse response = HTTP.post(request);\n```\n\nThe following code is an example of setting the message body of the request directly.\n\n```java\nRequest request = new Request(\"http://example.com/register\");\nString xml = \"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cuser\u003e\u003cid\u003e1234\u003c/id\u003e\u003cname\u003eAndy\u003c/name\u003e\u003c/user\u003e\";\nrequest.setBody(xml.getBytes(), \"text/xml\");\nResponse response = HTTP.post(request);\n```\n\n### PUT\n\nThe same as sending POST request.\n\n```java\nString json = \"{\\\"id\\\": \\\"12345\\, \\\"name\\\": \\\"Andy\\\"}\";\nResponse response = HTTP.put(\"http://example.com/register\", json.getBytes(), \"text/json\");\n```\n\n### DELETE\n\n```java\nResponse response = HTTP.delete(\"http://example.com/user/12345\");\n// or HTTP.delete(new Request(\"http://example.com/user/12345\"));\n```\n\n### OPTIONS\n\n```java\nResponse response = HTTP.options(\"http://example.com/blog/12345\");\n// or HTTP.options(new Request(\"http://example.com/blog/12345\"));\n\nresponse.getHeaders().get(\"Allow\").toString() // -\u003e \"[GET, HEAD, OPTIONS, TRACE]\"\n```\n\n### HEAD\n\n```java\nRequest request = new Request(\"http://example.com/\");\nResponse response = HTTP.head(request);\n\n// or\n// Response response = HTTP.head(\"http://example.com/\");\n```\n\n### TRACE\n\n```java\nRequest request = new Request(\"http://example.com/\");\nResponse response = HTTP.trace(request);\n\n// or\n// Response response = HTTP.trace(\"http://example.com/\");\n\nresponse.getTextBody();\n// TRACE / HTTP/1.1\n// User-Agent: Curly HTTP Client (https://github.com/m3dev/com.m3.curly)\n// Accept-Charset: UTF-8\n// Host: example.com\n// Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2\n// Connection: keep-alive\n//\n```\n\n### Async Request\n\nAll of the above has asynchronous APIs too.\n\n```java\nFuture\u003cResponse\u003e future = HTTP.asyncGet(\"http://www.example.com\");\nResponse response = future.get();\n\nAsyncRequest req = new AsyncRequest(\"http://www.example.com\")\nreq.setFailureHandler(new AsyncFailurehandler() {\n  public void handle(IOException e) {\n    // do something\n  }\n});\nHTTP.asyncGet(req);\n```\n\n\n## Scala Usage\n\n### GET\n\n```scala\nimport com.m3.curly.scala._\n\nval response = HTTP.get(\"http://search.example.com?query=Application\u0026lang=Scala\")\n\nval response = HTTP.get(\"http://search.example.com\", \"query\" -\u003e \"Application\", \"lang\" -\u003e \"Scala\")\n\nval status: Int = response.status\nval headers: Map[String, String] = response.headers\nval headerFields: Map[String, Seq[String]] = response.headerFields\nval rawCookies: Map[String, String] = response.rawCookies\nval html: String = response.asString # or response.textBody\nval bin: Array[Byte] = response.asBytes # or response.body\n```\n\nIf you need to configure HTTP requests (e.g. adding some headers), use `Request` directly.\n\n```scala\nval request = Request(\"http://example.com\").header(\"Authorization\", \"OAuth realm: ...\")\nval response = HTTP.get(request)\n```\n\n### POST/PUT\n\n```scala\nval response = HTTP.post(\"http://example.com/users\", \"aa=bb\u0026ccc=123\")\n\nval response = HTTP.post(\"http://example.com/users\", Map(\"aaa\" -\u003e \"bb\", \"ccc\" -\u003e 123))\n\nval response: Response = HTTP.post(\"http://example.com/users\",\n  FormData(name = \"name\", text = TextInput(\"Andy\", \"UTF-8\")),\n  FormData(name = \"profile_image\", file = FileInput(new java.io.File(\"./myface.jpg\"), \"myface.jpg\"), \"image/jpeg\"))\n  // or FormData(name = \"bin\", bytes = Array[Byte](1,2,3))\n```\n\n### DELETE/OPTIONS/HEAD/TRACE\n\n```scala\nval response = HTTP.delete(\"http://example.com/users/123\")\n\nval response = HTTP.options(\"http://example.com/\")\n\nval response = HTTP.head(\"http://example.com/\")\n\nval response = HTTP.trace(\"http://example.com/\")\n```\n\n### Async Request\n\nAll of the above has asynchronous APIs too.\n\n```java\nimport scala.concurrent._\nimport scala.concurrent.ExecutionContext.Implicits.global\n\nval future: Future[Response] = HTTP.asyncGet(\"http://www.example.com\");\n```\n\n## Developers\n\n- Kazuhiro Sera (@seratch)\n- Manabu Nakamura (@gakuzzzz)\n- Reki Murakami (@reki2000)\n\n## License\n\nCopyright 2012 M3, Inc.\n\nApache License, Version 2.0\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fm3dev%2Fcurly","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fm3dev%2Fcurly","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fm3dev%2Fcurly/lists"}