[
https://issues.apache.org/jira/browse/SQOOP-1795?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14223088#comment-14223088
]
Qian Xu edited comment on SQOOP-1795 at 11/25/14 8:59 AM:
----------------------------------------------------------
I try to get raw post data from {{request.getParameterMap()}}.
There are three cases:
1. No post data. The return value will be {{NULL}}.
2. Post data is in query string format (e.g. key1=a, val1=a1, key2-b, val2=b1,
key3=a, val3=value_of_duplicate_key). The return value should be
a=a1&b=b1&a=value_of_duplicate_key.
3. Post data is a raw string (in Sqoop's case a JSON). The return value should
be exactly the same JSON.
I'm re-working on method description and tests.
was (Author: stanleyxu2005):
I try to get raw post data from {{request.getParameterMap()}}.
There are three cases:
1. No post data. The return value will be {{NULL}}.
2. Post data is in query string format (e.g. key1=a, val1=a1, key2-b, val2=b1,
key3=a, val3=value_of_duplicate_key). The return value should be
a=a1&b=b1&a=value_of_duplicate_key.
3. Post data is a raw string (in Sqoop's case a JSON). The return value should
be exactly the same JSON.
My first patch handles case 3 only, which is okay for Sqoop but not generic
enough. I'm re-working on it.
> Sqoop2: Retrieve Http post data in plausible manner
> ---------------------------------------------------
>
> Key: SQOOP-1795
> URL: https://issues.apache.org/jira/browse/SQOOP-1795
> Project: Sqoop
> Issue Type: Sub-task
> Reporter: Qian Xu
> Assignee: Qian Xu
> Fix For: 1.99.5
>
>
> Sqoop client posts parameters as JSON to server. As it is not query string
> based pattern, {{HttpServletRequest}} is not able to return the JSON using
> {{getParameterValue(...)}}. The current solution is to call {{getReader()}}
> to get raw post data. There is a danger, if the method is NOT called at the
> first place. You do not know, whether the reading position is at the
> beginning. You might get unexpected result without notice. SQOOP-1784 is a
> unfortunate case.
> {code}
> // 2 line unlucky code
> String username = ctx.getUserName(); // The method will change reading
> position of reader internally
> JSONObject postData = (JSONObject)
> JSONValue.parse(ctx.getRequest().getReader()); // No contents read
> // 2 line lucky code
> JSONObject postData = (JSONObject)
> JSONValue.parse(ctx.getRequest().getReader()); // Good
> String username = ctx.getUserName(); // Good
> {code}
> In practice, it'd suggest to use query string base pattern, i.e.
> jsonObject=JSON. The server can call {{ctx.getParameterValue("jsonObject")}}
> to get the value without any problem. But we need to change the api.
> Now it is perfectly clear:
> 1. For query string based pattern, caller should always use
> {{getParameterValue(...)}}.
> 2. For raw post data usage, the post data is parsed as the first parameter's
> key. So I'd suggest to add {{RequestContext.getFirstParameterName()}}. so
> that we can keep fingers away from {{getReader()}}.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)