Can't create GET request route


I’m trying to create a custom API on Discourse for a plugin I’m working on.
I haven’t any problem to create a POST request, but when I try to create one with GET, it all the time returns a 404 error page.

Here is my code.

after_initialize do
    module ::MyApiComments
        class Engine < ::Rails::Engine
            engine_name "myapi_comments"
            isolate_namespace MyApiComments
    class MyApiComments::CommentsController < ::ApplicationController
        def get_topic_comments
            # Some stuff here
            render :json => message, :status => 200

    MyApiComments::Engine.routes.draw do
        get '/myapi-t/:id' => 'comments#get_topic_comments'

    Discourse::Application.routes.append do
        mount ::MyApiComments::Engine, at: "/"

When I use post '/myapi-t/:id' => 'comments#get_topic_comments', all works fine. But I absolutely need to use a GET request and I can’t understand why it doesn’t works.

(by the way, I know there is already an API route to get topic posts, but I don’t use it for good reasons :))

Thanks for your help :).


If you check your Rails logs, which controller is that route hitting?

1 Like

Thanks for your answer. Here is the log.

Processing by MyApiComment::CommentsController#get_topic_comments as */*
  Parameters: {"id"=>"8"}
  Rendered default/empty.html.erb within layouts/application (0.5ms)
  Rendered layouts/_head.html.erb (34.0ms)
  Rendered common/_google_universal_analytics.html.erb (0.8ms)
  Rendered common/_discourse_stylesheet.html.erb (21.6ms)
  Rendered common/_special_font_face.html.erb (2.3ms)
  Rendered application/_header.html.erb (0.8ms)
  Rendered common/_discourse_javascript.html.erb (117.0ms)
  Rendered common/_google_analytics.html.erb (0.7ms)
Completed 200 OK in 453ms (Views: 277.3ms | ActiveRecord: 47.3ms)

Do you mean you’re getting 404 on the client side? Based on the logs you pasted, it is returning a 200 response.

Yeah, it seems it is a 200, not a 404 error page, sorry for mistake.
What I’m really getting is an HTML view with header content (logo, nav, etc.), but not a json string with what I asked for (using render :json).

This sounds like a an You might get a better answer if you back up and describe what you are trying to accomplish.

A GET request which returns JSON, as I described on my first message :).
Make a POST requests returns JSON I asked for, the GET one returns HTML. That is my current problem.

Thanks for trying to help me.

When you request the route, try putting .json at the end.

When you request a page on discourse, by default it returns the Ember app. If you want to use it programmatically, you need to put .json at the end.



Hmm, really nice thing to know :D.
I knew (I’m using it for other things) that the Discourse API needs to end by .json, but on a specific route that I declared myself… Is this documented somewhere?

Really thanks for your answer.