This is an automated email from the ASF dual-hosted git repository.

nfrankel pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/apisix-website.git


The following commit(s) were added to refs/heads/master by this push:
     new e4dd3c1d373 blog: Add Advanced URL rewriting with Apache APISIX post 
(#1806)
e4dd3c1d373 is described below

commit e4dd3c1d37369c3625042402d647f98e36d82539
Author: Nicolas Fränkel <[email protected]>
AuthorDate: Thu Jul 18 11:36:26 2024 +0200

    blog: Add Advanced URL rewriting with Apache APISIX post (#1806)
    
    * blog: Add Advanced URL rewriting with Apache APISIX post
    
    * Update according to Traky's suggestion
    
    Co-authored-by: Traky Deng <[email protected]>
    
    ---------
    
    Co-authored-by: Traky Deng <[email protected]>
---
 .../blog/2024/07/18/advanced-url-rewrite-apisix.md | 88 ++++++++++++++++++++++
 1 file changed, 88 insertions(+)

diff --git a/blog/en/blog/2024/07/18/advanced-url-rewrite-apisix.md 
b/blog/en/blog/2024/07/18/advanced-url-rewrite-apisix.md
new file mode 100644
index 00000000000..187071137fa
--- /dev/null
+++ b/blog/en/blog/2024/07/18/advanced-url-rewrite-apisix.md
@@ -0,0 +1,88 @@
+---
+title: Advanced URL rewriting with Apache APISIX
+authors:
+  - name: Nicolas Fränkel
+    title: Author
+    url: https://github.com/nfrankel
+    image_url: https://avatars.githubusercontent.com/u/752258
+keywords:
+  - APISIX
+  - URL
+  - URL rewriting
+description: >
+  I spoke at Swiss PgDay in Switzerland in late June. The talk was about how 
to create a no-code API with the famous PostgreSQL database, the related 
PostgREST, and Apache APISIX, of course. I already wrote about the idea in a 
previous post. However, I wanted to improve it, if only slightly.
+  PostgREST offers a powerful `SELECT` mechanism. To list all entities with a 
column equal to a value, you need the following command: curl /products?id=eq.1.
+tags: [Ecosystem]
+image: 
https://static.apiseven.com/uploads/2024/07/11/zFguMrgf_notebook-1840276.jpg
+---
+
+<head>
+    <link rel="canonical" 
href="https://blog.frankel.ch/advanced-url-rewrite-apisix/"; />
+</head>
+
+>I spoke at [Swiss PgDay](https://www.pgday.ch/2024/#schedule) in Switzerland 
in late June. The talk was about how to create a no-code API with the famous 
[PostgreSQL](https://www.postgresql.org/) database, the related 
[PostgREST](https://postgrest.org/), and [Apache 
APISIX](https://apisix.apache.org), of course. I already wrote about the idea 
in a [previous post](https://blog.frankel.ch/poor-man-api/). However, I wanted 
to improve it, if only slightly.
+>
+>PostgREST offers a powerful `SELECT` mechanism. To list all entities with a 
column equal to a value, you need the following command:
+
+<!--truncate-->
+
+```bash
+curl /products?id=eq.1
+```
+
+1. `id` is the column
+2. `eq.1` corresponds to the `WHERE` clause
+
+In this case, the generated query is `SELECT * FROM products WHERE id=1`.
+
+The [query 
syntax](https://postgrest.org/en/v12/references/api/tables_views.html#get-and-head)
 is powerful and allows you to express complex queries. However, as an API 
designer, I want to avoid exposing users to this complexity. For example, a 
regular API can manage entities by their ID, _e.g._, `/products/1`. In turn, 
you'd expect PostgREST to be able to do the same with primary keys. 
Unfortunately, it doesn't treat primary keys any differently than regular 
columns. Apache APISIX to th [...]
+
+One of APISIX's best features is to rewrite requests, _i.e._, exposing 
`/products/1` and forwarding `/products?id=eq.1` to PostgREST. Let's do it.
+
+First, we need to capture the ID of the path parameter. For this, we need to 
replace the regular radix tree router with the radix tree with a parameter 
router.
+
+```yaml
+apisix:
+    router:
+        http: radixtree_uri_with_parameter
+```
+
+The next step is to rewrite the URL. We use the 
[proxy-rewrite](https://apisix.apache.org/docs/apisix/plugins/proxy-rewrite/) 
plugin for this on a `/products/:id` route. Unfortunately, using the `:id` 
parameter above in the regular expression is impossible. We need to copy it to 
a place that is accessible. To do that, before the rewriting, we can leverage 
the 
[serverless-pre-function](https://apisix.apache.org/docs/apisix/plugins/serverless/).
 With the plugin, you can write Lua code dire [...]
+
+Here's the configuration:
+
+```bash
+curl -i http://localhost:9180/apisix/admin/plugin_configs/1 -X PUT -d '
+{
+  "plugins": {
+    "serverless-pre-function": {
+      "phase": "rewrite",
+      "functions" : [
+        "return function(_, ctx)
+          ctx.var.product_id = ctx.curr_req_matched.id;         #1
+        end"
+      ]
+    },
+    "proxy-rewrite": {
+      "uri": "/products?id=eq.$product_id"                      #2
+    }
+  }
+}'
+```
+
+1. Copy the captured `id` variable to a place accessible to other plugins 
later on
+2. Use it!
+
+Thanks to my colleague [Zeping](https://github.com/bzp2010) for pointing out 
the solution to me!
+
+You can expose the `/products/1` REST-friendly URL and let APISIX rewrite it 
for PostgREST.
+
+## Conclusion
+
+I've described using the `proxy-rewrite` plugin with a path variable in this 
post. You can reuse the same technique with multiple variables. Keep also in 
mind that the `serverless` plugin is a hidden jewel; it can help you with small 
Lua snippets before moving to a full-fledged plugin.
+
+**To go further:**
+
+* [PostgREST](https://postgrest.org/en/v12/references)
+* [PostgREST tables and 
views](https://postgrest.org/en/v12/references/api/tables_views.html)
+* [APISIX serverless 
plugin](https://apisix.apache.org/docs/apisix/plugins/serverless/)

Reply via email to