Can't create GET request route


(Mathieu Menut) #1

Hello,

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
        end
    end
   
    class MyApiComments::CommentsController < ::ApplicationController
        def get_topic_comments
            # Some stuff here
            render :json => message, :status => 200
        end
    end

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

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

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 :).


(Alan Tan) #2

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


(Mathieu Menut) #3

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)

(Alan Tan) #4

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


(Mathieu Menut) #5

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).


(Jay Pfaffman) #6

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


(Mathieu Menut) #7

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.


(David Taylor) #8

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.


(Mathieu Menut) #9

Ho.

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.