1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
<TITLE> [99s-extend] REST responses
</TITLE>
<LINK REL="Index" HREF="index.html" >
<LINK REL="made" HREF="mailto:extend%40lists.ninenines.eu?Subject=Re%3A%20%5B99s-extend%5D%20REST%20responses&In-Reply-To=%3C537BA2EA.5080108%40ninenines.eu%3E">
<META NAME="robots" CONTENT="index,nofollow">
<style type="text/css">
pre {
white-space: pre-wrap; /* css-2.1, curent FF, Opera, Safari */
}
</style>
<META http-equiv="Content-Type" content="text/html; charset=us-ascii">
<LINK REL="Previous" HREF="000384.html">
<LINK REL="Next" HREF="000388.html">
</HEAD>
<BODY BGCOLOR="#ffffff">
<H1>[99s-extend] REST responses</H1>
<B>Loïc Hoguin</B>
<A HREF="mailto:extend%40lists.ninenines.eu?Subject=Re%3A%20%5B99s-extend%5D%20REST%20responses&In-Reply-To=%3C537BA2EA.5080108%40ninenines.eu%3E"
TITLE="[99s-extend] REST responses">essen at ninenines.eu
</A><BR>
<I>Tue May 20 20:46:02 CEST 2014</I>
<P><UL>
<LI>Previous message: <A HREF="000384.html">[99s-extend] REST responses
</A></li>
<LI>Next message: <A HREF="000388.html">[99s-extend] REST responses
</A></li>
<LI> <B>Messages sorted by:</B>
<a href="date.html#386">[ date ]</a>
<a href="thread.html#386">[ thread ]</a>
<a href="subject.html#386">[ subject ]</a>
<a href="author.html#386">[ author ]</a>
</LI>
</UL>
<HR>
<!--beginarticle-->
<PRE>Hi,
On 05/20/2014 06:27 PM, Paulo F. Oliveira wrote:
><i> Hello.
</I>><i>
</I>><i> First of all, thanks for the great work you've done with cowboy. I've
</I>><i> been using it with a fait amount of success and I'm a fairly new Erlang
</I>><i> developer. I'm mainly interested in the REST "interface" of the
</I>><i> application and its way of doing RESTful things, and I like the way you
</I>><i> did it (what with all the content_types_provided, service_available,
</I>><i> etc. functions). I've tested the way the system reacted to the different
</I>><i> Accept, Content-Type, etc. headers and always got very well-opinionated
</I>><i> responses (406, 415, ...).
</I>><i>
</I>><i> A couple of questions remain though (I'm sorry if they've been asked
</I>><i> already but I've searched the web for answers and read the available
</I>><i> docs and couldn't find them):
</I>><i>
</I>><i> 1. is it expected that, if I use cowboy_req:reply/2 in a GET handler
</I>><i> (coming from content_types_provided), the onresponse/4 hook be called
</I>><i> twice? I guess one is due to the reply and the other one due to the
</I>><i> workflow of the request, but is there a way to prevent the second execution?
</I>
If you reply from a callback you must call {halt, Req, State} to stop
processing.
><i> 2. if I want to JSON-parse ALL my requests should I a) use the
</I>><i> onrequest/1 hook or b) do this on a per-request basis? Because I'd like
</I>><i> to reply with a 400 ASAP but keep going if the JSON validates (I'm going
</I>><i> to use JSON-schema for validating input); and, if possible, have the
</I>><i> JSON-parsed body stored somewhere for future manipulation.
</I>
It makes little sense to do it before the accept callback you define.
Not only because you will duplicate content-type checks and whatnot, but
also because you don't actually win anything from doing this. If you are
using JSON, then JSON processing will take infinitely more resources
than the REST code.
><i> 3. I haven't seen examples that made use of the State (from the function
</I>><i> returns). When should I use this instead of the Request metadata? I'd
</I>><i> like to be able to set a generic error state for a request (either in
</I>><i> meta ou State) and that have a "standard" error response be created at a
</I>><i> later time (in a unique function, for example - e.g. onresponse/4).
</I>
State is for the functions within the current module. Look at
cowboy_static for an example.
><i> 4. is there anything like a catch-all exception handler? I'd like to
</I>><i> catch exceptions that occur anywhere so I could log them and analyze
</I>><i> them at a later moment.
</I>
You can add your own error_logger handler, or use something like lager.
All errors end up sending a message to error_logger.
><i> I'm probably abusing the onresponse/onrequest hooks already, so your
</I>><i> answers should help me clarify this.
</I>
Sounds like it!
><i> Thanks.
</I>><i>
</I>><i> - Paulo
</I>><i>
</I>><i>
</I>><i> _______________________________________________
</I>><i> Extend mailing list
</I>><i> <A HREF="https://lists.ninenines.eu/listinfo/extend">Extend at lists.ninenines.eu</A>
</I>><i> <A HREF="https://lists.ninenines.eu/listinfo/extend">https://lists.ninenines.eu/listinfo/extend</A>
</I>><i>
</I>
--
Loïc Hoguin
<A HREF="http://ninenines.eu">http://ninenines.eu</A>
</PRE>
<!--endarticle-->
<HR>
<P><UL>
<!--threads-->
<LI>Previous message: <A HREF="000384.html">[99s-extend] REST responses
</A></li>
<LI>Next message: <A HREF="000388.html">[99s-extend] REST responses
</A></li>
<LI> <B>Messages sorted by:</B>
<a href="date.html#386">[ date ]</a>
<a href="thread.html#386">[ thread ]</a>
<a href="subject.html#386">[ subject ]</a>
<a href="author.html#386">[ author ]</a>
</LI>
</UL>
<hr>
<a href="https://lists.ninenines.eu/listinfo/extend">More information about the Extend
mailing list</a><br>
</body></html>
|