[prev in list] [next in list] [prev in thread] [next in thread] 

List:       axis-dev
Subject:    [jira] [Updated] (AXIS2-5929) REST GET request using Accept HTTP Header to indicate JSON, does not w
From:       "Marti Pamies Sola (Jira)" <jira () apache ! org>
Date:       2022-11-15 16:26:00
Message-ID: JIRA.13178196.1533883534000.107526.1668529560039 () Atlassian ! JIRA
[Download RAW message or body]


     [ https://issues.apache.org/jira/browse/AXIS2-5929?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel \
]

Marti Pamies Sola updated AXIS2-5929:
-------------------------------------
          Component/s: transports
    Affects Version/s: 1.8.3
                           (was: 1.7.8)
          Description: 
I am implementing a REST services according to [HL7 FHIR|[http://www.hl7.org/fhir/],] \
that must be able to return a Patient resource, both on xml or json, depending on \
http Accept header, and I am not able to implement it using axis.

Request is:
 * {color:#505050}[http://localhost:8080/opencdefhirserver/services/FHIR/Binary/4295642378]{color}
                
 * {color:#505050}Accept =application/fhir+json
{color}

Where, FHIR is my service; Binary is the axis2 operation to be executed (mapping to a \
FHIR resource); and {color:#505050}4295642378{color} the resource id.

The exception I get is:

"{_}No JSON message received through HTTP GET or POST"{_}

I've been reviewing source code and I guess the issue comes from this fragment of \
code at org.apache.axis2.json.AbstractJSONOMBuilder.java line 85:

  
{code:java}
//                       if ((index = requestURL.indexOf("=")) > 0) {
                               jsonString = requestURL.substring(index + 1);
                               reader = new StringReader(jsonString);
                       } else {
                               throw new AxisFault("No JSON message received through \
HTTP GET or POST");  }
{code}
As it only accepts parameters as Query String, and when not provided it raise an \
exception.

Also once previous code fixed, I realize that axis does not take care or Accept HTTP \
Header, so GET Requests where not payload is provided and so no contentType is \
specified, are just able to return as XML, but not JSON. 

See org.apache.axis2.transport.http.util.RESTUtil line 144
{code:java}
                 if (contentType == null || "".equals(contentType)) {
                        contentType = HTTPConstants.MEDIA_TYPE_X_WWW_FORM;
                  } {code}
  

I've implemented and improvement on both classes in order to be able to mange those \
request and done the Pull Request.

Hope useful.

Thanks,

Martí

  

  was:
At a REST services, I do not receive HTTP GET requests when content-type is json, and \
parameters are at request URL path (not as Query string). Let me explain in detail:

I am implementing a REST services according to [HL7 FHIR|[http://www.hl7.org/fhir/],] \
that must be able to return content both on xml and json (depending on http header \
content-type), once an HTTP GET request is received. Keys for the information to be \
                returned can be provided both directly at the request URL path or as \
                a Query String:
 * Keys at URL path: \
{color:#505050}[http://localhost:8080/opencdefhirserver/services/FHIR/Binary/4295642378]{color}
                
 * Keys as Query string: \
{color:#505050}[http://localhost:8080/opencdefhirserver/services/FHIR/Binary?id4295642 \
378|http://localhost:8080/opencdefhirserver/services/FHIR/Binary/4295642378]{color}

Where, FHIR is my service; Binary is the axis2 operation to be executed (mapping to a \
FHIR resource); and {color:#505050}4295642378{color} the resource id.

Providing keys as Query String work properly with xml and json, but providing key at \
URL path just work with xml, on json I get the following exception:

"_No JSON message received through HTTP GET or POST"_

I've been reviewing source code and I guess the issue comes form this fragment of \
code at AbstractJSONOMBuilder.java line 85:

  
{code:java}
//                       if ((index = requestURL.indexOf("=")) > 0) {
                               jsonString = requestURL.substring(index + 1);
                               reader = new StringReader(jsonString);
                       } else {
                               throw new AxisFault("No JSON message received through \
HTTP GET or POST");  }
{code}
As it only accepts parameters as Query String, and when not provided it raise an \
exception.

I propose the following modification, where if not Query String is provided, it \
considers full request URL as input json. {code:java}
//                        if ((index = requestURL.indexOf("=")) > 0) {
                               jsonString = requestURL.substring(index + 1);
                               reader = new StringReader(jsonString);
                       } else {
                               /*
                                 * MARTI PAMIES SOLA
                                 * Get JSON message from request URI if not present \
                as parameter.
                                 * To be able to response to full URL requests
                                 */
                              HttpServletRequest httpServeltRqst \
                =(HttpServletRequest)messageContext.getProperty("transport.http.servletRequest");
                
                              String requestParam=httpServeltRqst.getRequestURI();
                              if (!(requestParam.equals(""))) {
                                     jsonString = requestParam;
                                       reader = new StringReader(jsonString);
                              }else {
                                    throw new AxisFault("No JSON message received \
through HTTP GET or POST");  }
                       }
{code}
I've test locally and it work for me, so I propose to include modification at next \
release. Attached is the new AbstractJSONOMBuilder.java file and also the svn patch.

Hope useful.

Thanks,

Martí

  

              Summary: REST GET request using Accept HTTP Header to indicate JSON, \
does not working  (was: REST Services URL GET json request not working)

I've update issue description as when I've updated my projecte to axis1.8.2 I realize \
I've to do another improvement.

Hope this fixed at next version.

> REST GET request using Accept HTTP Header to indicate JSON, does not working
> ----------------------------------------------------------------------------
> 
> Key: AXIS2-5929
> URL: https://issues.apache.org/jira/browse/AXIS2-5929
> Project: Axis2
> Issue Type: Improvement
> Components: json, transports
> Affects Versions: 1.8.3
> Reporter: Marti Pamies Sola
> Priority: Minor
> Attachments: AbstractJSONOMBuilder.java, AbstractJSONOMBuilder.java.patch
> 
> 
> I am implementing a REST services according to [HL7 \
> FHIR|[http://www.hl7.org/fhir/],] that must be able to return a Patient resource, \
> both on xml or json, depending on http Accept header, and I am not able to \
> implement it using axis. Request is:
> * {color:#505050}[http://localhost:8080/opencdefhirserver/services/FHIR/Binary/4295642378]{color}
>                 
> * {color:#505050}Accept =application/fhir+json
> {color}
> Where, FHIR is my service; Binary is the axis2 operation to be executed (mapping to \
> a FHIR resource); and {color:#505050}4295642378{color} the resource id. The \
> exception I get is: "{_}No JSON message received through HTTP GET or POST"{_}
> I've been reviewing source code and I guess the issue comes from this fragment of \
> code at org.apache.axis2.json.AbstractJSONOMBuilder.java line 85: 
> {code:java}
> //                       if ((index = requestURL.indexOf("=")) > 0) {
> jsonString = requestURL.substring(index + 1);
> reader = new StringReader(jsonString);
> } else {
> throw new AxisFault("No JSON message received through HTTP GET or POST");
> }
> {code}
> As it only accepts parameters as Query String, and when not provided it raise an \
> exception. Also once previous code fixed, I realize that axis does not take care or \
> Accept HTTP Header, so GET Requests where not payload is provided and so no \
> contentType is specified, are just able to return as XML, but not JSON.  See \
> org.apache.axis2.transport.http.util.RESTUtil line 144 {code:java}
> if (contentType == null || "".equals(contentType)) {
> contentType = HTTPConstants.MEDIA_TYPE_X_WWW_FORM;
> } {code}
> 
> I've implemented and improvement on both classes in order to be able to mange those \
> request and done the Pull Request. Hope useful.
> Thanks,
> Martí
> 



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: java-dev-unsubscribe@axis.apache.org
For additional commands, e-mail: java-dev-help@axis.apache.org


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic