<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic SOE REST Web Service - How to return different MIME content types? java in ArcGIS Enterprise Questions</title>
    <link>https://community.esri.com/t5/arcgis-enterprise-questions/soe-rest-web-service-how-to-return-different-mime/m-p/694596#M26630</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;Folks,&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I posted this in the ArcObjects forum, but thought I'd see if anyone here might have an idea, too.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;After upgrading to 10.0 Release, and making the requisite changes to my REST operation's method signature (by adding an additional parameter, requestProperties), my SOE no longer returns a PNG image that clients can use; instead, it returns the PNG's byte array representation as text.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;I've spent some time today looking into the cause of this, and it seems like this is the case:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;1) At 10.0 Prerelease, my SOE's HTTP response contained no content type.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;2) At 10.0 Release, the response contains this content type: "text/plain;charset=utf-8"&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;To my surprise, I noticed a new method- handleRESTRequest and parameter - ring[] responseProperties. Looking at its documentation in the object browser, this seemed to be something useful, and might just give me what I need. However, I'm not actually able to get it to work. When I try something like this...&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;PRE class="plain" name="code"&gt;@Override
 public byte[] handleRESTRequest(String capabilities, String resourceName,
&amp;nbsp;&amp;nbsp; String operationName, String operationInput, String outputFormat,
&amp;nbsp;&amp;nbsp; String requestProperties, String[] responseProperties)
&amp;nbsp;&amp;nbsp; throws IOException, AutomationException {

&amp;nbsp; /*
&amp;nbsp;&amp;nbsp; * This method handles REST requests by determining whether an operation
&amp;nbsp;&amp;nbsp; * or resource has been invoked and then forwards the request to
&amp;nbsp;&amp;nbsp; * appropriate methods.
&amp;nbsp;&amp;nbsp; */

&amp;nbsp; try
&amp;nbsp; {
&amp;nbsp;&amp;nbsp; // if no operationName is specified send description of specified
&amp;nbsp;&amp;nbsp; // resource
&amp;nbsp;&amp;nbsp; if (operationName.length() == 0)
&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; return getResource(resourceName);
&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp; else
&amp;nbsp;&amp;nbsp; // invoke REST operation on specified resource
&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; return invokeRESTOperation(capabilities, resourceName, operationName, operationInput, outputFormat,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; requestProperties, responseProperties);
&amp;nbsp;&amp;nbsp; }
&amp;nbsp; }
&amp;nbsp; catch (Exception e)
&amp;nbsp; {
&amp;nbsp;&amp;nbsp; return ServerUtilities.sendError(0, "Exception occurred: " + e.getMessage(), null).getBytes("utf-8");
&amp;nbsp; } 
 }



private byte[] invokeRESTOperation(String capabilitiesList, String resourceName, String operationName,
&amp;nbsp;&amp;nbsp; String operationInput, String outputFormat, String requestProperties, String[] responseProperties) throws Exception
 {
&amp;nbsp; JSONObject response=null;
&amp;nbsp; 
&amp;nbsp; byte[] operationOutput = null;
&amp;nbsp; JSONObject operationInputAsJSON = new JSONObject(operationInput);

&amp;nbsp; 
&amp;nbsp; 
&amp;nbsp; //parse request properties and create a map
&amp;nbsp; java.util.Map&amp;lt;String, String&amp;gt; requestPropertiesMap = new HashMap&amp;lt;String, String&amp;gt;();
&amp;nbsp; if (requestProperties != null &amp;amp;&amp;amp; requestProperties.length() &amp;gt; 0)
&amp;nbsp; {
&amp;nbsp;&amp;nbsp; JSONObject requestPropertiesJSON = new JSONObject(requestProperties);
&amp;nbsp;&amp;nbsp; Iterator&amp;lt;String&amp;gt; jsonKeys = requestPropertiesJSON.keys();
&amp;nbsp;&amp;nbsp; while (jsonKeys.hasNext())
&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; String key = jsonKeys.next();
&amp;nbsp;&amp;nbsp;&amp;nbsp; requestPropertiesMap.put(key, requestPropertiesJSON.getString(key));
&amp;nbsp;&amp;nbsp; }
&amp;nbsp; }
&amp;nbsp; //create a Map to hold response properties
&amp;nbsp; java.util.Map&amp;lt;String, String&amp;gt; responsePropertiesMap = new HashMap&amp;lt;String, String&amp;gt;(); 
&amp;nbsp; if (resourceName.equalsIgnoreCase("") || resourceName.length() == 0)
&amp;nbsp; {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp; if (operationName!=null)
&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; response= new JSONObject();
&amp;nbsp;&amp;nbsp;&amp;nbsp; MapWMSServer mapWMSServer=new MapWMSServer();
&amp;nbsp;&amp;nbsp;&amp;nbsp; operationOutput =mapWMSServer.doPost(operationInputAsJSON,operationName, response, mapServer);
&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp; else
&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; operationOutput = sendError(0, "Operation " + "\"" + operationName + "\" not supported on resource " + resourceName + ".", 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new String[]{"No other details", " specified"}).getBytes();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp; }
&amp;nbsp; else //if non existent sub-resource specified, report error
&amp;nbsp; {
&amp;nbsp;&amp;nbsp; operationOutput = sendError(0, "No sub-resource by name \"" + resourceName + "\" found.", new String[]{""}).getBytes("utf-8"); 
&amp;nbsp; }
 
&amp;nbsp; 
&amp;nbsp; if(response!=null){
&amp;nbsp;&amp;nbsp; /*responseProperties = new String[response.length()];
&amp;nbsp;&amp;nbsp; Iterator it=response.keys();
&amp;nbsp;&amp;nbsp; int i=0;
&amp;nbsp;&amp;nbsp; while(it.hasNext()){
&amp;nbsp;&amp;nbsp;&amp;nbsp; String key = (String)it.next();
&amp;nbsp;&amp;nbsp;&amp;nbsp; String value =&amp;nbsp; response.getString(key);
&amp;nbsp;&amp;nbsp;&amp;nbsp; //responseProperties&lt;I&gt;="\""+ key+"\":\""+value+"\"";
&amp;nbsp;&amp;nbsp;&amp;nbsp; responseProperties&lt;I&gt; = key + "=" + value;
&amp;nbsp;&amp;nbsp;&amp;nbsp; i++;
&amp;nbsp;&amp;nbsp; }*/
&amp;nbsp;&amp;nbsp; /*if(!response.isNull("Content-Type")&amp;amp;&amp;amp; response.getString("Content-Type")!=null)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; responseProperties[0]="\"Content-Type\":\""+response.getString("Content-Type")+"\"";*/
&amp;nbsp;&amp;nbsp; //responseProperties= new String[]{response.toString()};
&amp;nbsp; }
&amp;nbsp; JSONObject resp=new JSONObject();
&amp;nbsp; resp.put("Content-Type", "image/png");
&amp;nbsp; responseProperties = new String[]{resp.toString()};
&amp;nbsp; String ss=responseProperties[0];
&amp;nbsp; serverLog.addMessage(1, 800, ss);
&amp;nbsp; //convert response properties to String array
&amp;nbsp; /*if (!responsePropertiesMap.isEmpty())
&amp;nbsp; {
&amp;nbsp;&amp;nbsp; Set&amp;lt;String&amp;gt; keys = responsePropertiesMap.keySet();
&amp;nbsp;&amp;nbsp; Iterator&amp;lt;String&amp;gt; keysIterator = keys.iterator();
&amp;nbsp;&amp;nbsp; int i = 0;
&amp;nbsp;&amp;nbsp; while (keysIterator.hasNext())
&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; String key = keysIterator.next();
&amp;nbsp;&amp;nbsp;&amp;nbsp; String value = responsePropertiesMap.get(key);
&amp;nbsp;&amp;nbsp;&amp;nbsp; responseProperties&lt;I&gt; = key + "=" + value;
&amp;nbsp;&amp;nbsp;&amp;nbsp; i++;
&amp;nbsp;&amp;nbsp; }
&amp;nbsp; }*/
&amp;nbsp; 
&amp;nbsp; return operationOutput; 
 } 
&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/PRE&gt;&lt;DIV style="display:none;"&gt; &lt;/DIV&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Wed, 23 Jan 2013 04:57:48 GMT</pubDate>
    <dc:creator>prettyboy123123prettyboy123123</dc:creator>
    <dc:date>2013-01-23T04:57:48Z</dc:date>
    <item>
      <title>SOE REST Web Service - How to return different MIME content types? java</title>
      <link>https://community.esri.com/t5/arcgis-enterprise-questions/soe-rest-web-service-how-to-return-different-mime/m-p/694596#M26630</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;Folks,&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I posted this in the ArcObjects forum, but thought I'd see if anyone here might have an idea, too.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;After upgrading to 10.0 Release, and making the requisite changes to my REST operation's method signature (by adding an additional parameter, requestProperties), my SOE no longer returns a PNG image that clients can use; instead, it returns the PNG's byte array representation as text.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;I've spent some time today looking into the cause of this, and it seems like this is the case:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;1) At 10.0 Prerelease, my SOE's HTTP response contained no content type.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;2) At 10.0 Release, the response contains this content type: "text/plain;charset=utf-8"&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;To my surprise, I noticed a new method- handleRESTRequest and parameter - ring[] responseProperties. Looking at its documentation in the object browser, this seemed to be something useful, and might just give me what I need. However, I'm not actually able to get it to work. When I try something like this...&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;PRE class="plain" name="code"&gt;@Override
 public byte[] handleRESTRequest(String capabilities, String resourceName,
&amp;nbsp;&amp;nbsp; String operationName, String operationInput, String outputFormat,
&amp;nbsp;&amp;nbsp; String requestProperties, String[] responseProperties)
&amp;nbsp;&amp;nbsp; throws IOException, AutomationException {

&amp;nbsp; /*
&amp;nbsp;&amp;nbsp; * This method handles REST requests by determining whether an operation
&amp;nbsp;&amp;nbsp; * or resource has been invoked and then forwards the request to
&amp;nbsp;&amp;nbsp; * appropriate methods.
&amp;nbsp;&amp;nbsp; */

&amp;nbsp; try
&amp;nbsp; {
&amp;nbsp;&amp;nbsp; // if no operationName is specified send description of specified
&amp;nbsp;&amp;nbsp; // resource
&amp;nbsp;&amp;nbsp; if (operationName.length() == 0)
&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; return getResource(resourceName);
&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp; else
&amp;nbsp;&amp;nbsp; // invoke REST operation on specified resource
&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; return invokeRESTOperation(capabilities, resourceName, operationName, operationInput, outputFormat,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; requestProperties, responseProperties);
&amp;nbsp;&amp;nbsp; }
&amp;nbsp; }
&amp;nbsp; catch (Exception e)
&amp;nbsp; {
&amp;nbsp;&amp;nbsp; return ServerUtilities.sendError(0, "Exception occurred: " + e.getMessage(), null).getBytes("utf-8");
&amp;nbsp; } 
 }



private byte[] invokeRESTOperation(String capabilitiesList, String resourceName, String operationName,
&amp;nbsp;&amp;nbsp; String operationInput, String outputFormat, String requestProperties, String[] responseProperties) throws Exception
 {
&amp;nbsp; JSONObject response=null;
&amp;nbsp; 
&amp;nbsp; byte[] operationOutput = null;
&amp;nbsp; JSONObject operationInputAsJSON = new JSONObject(operationInput);

&amp;nbsp; 
&amp;nbsp; 
&amp;nbsp; //parse request properties and create a map
&amp;nbsp; java.util.Map&amp;lt;String, String&amp;gt; requestPropertiesMap = new HashMap&amp;lt;String, String&amp;gt;();
&amp;nbsp; if (requestProperties != null &amp;amp;&amp;amp; requestProperties.length() &amp;gt; 0)
&amp;nbsp; {
&amp;nbsp;&amp;nbsp; JSONObject requestPropertiesJSON = new JSONObject(requestProperties);
&amp;nbsp;&amp;nbsp; Iterator&amp;lt;String&amp;gt; jsonKeys = requestPropertiesJSON.keys();
&amp;nbsp;&amp;nbsp; while (jsonKeys.hasNext())
&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; String key = jsonKeys.next();
&amp;nbsp;&amp;nbsp;&amp;nbsp; requestPropertiesMap.put(key, requestPropertiesJSON.getString(key));
&amp;nbsp;&amp;nbsp; }
&amp;nbsp; }
&amp;nbsp; //create a Map to hold response properties
&amp;nbsp; java.util.Map&amp;lt;String, String&amp;gt; responsePropertiesMap = new HashMap&amp;lt;String, String&amp;gt;(); 
&amp;nbsp; if (resourceName.equalsIgnoreCase("") || resourceName.length() == 0)
&amp;nbsp; {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp; if (operationName!=null)
&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; response= new JSONObject();
&amp;nbsp;&amp;nbsp;&amp;nbsp; MapWMSServer mapWMSServer=new MapWMSServer();
&amp;nbsp;&amp;nbsp;&amp;nbsp; operationOutput =mapWMSServer.doPost(operationInputAsJSON,operationName, response, mapServer);
&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp; else
&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; operationOutput = sendError(0, "Operation " + "\"" + operationName + "\" not supported on resource " + resourceName + ".", 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new String[]{"No other details", " specified"}).getBytes();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp; }
&amp;nbsp; else //if non existent sub-resource specified, report error
&amp;nbsp; {
&amp;nbsp;&amp;nbsp; operationOutput = sendError(0, "No sub-resource by name \"" + resourceName + "\" found.", new String[]{""}).getBytes("utf-8"); 
&amp;nbsp; }
 
&amp;nbsp; 
&amp;nbsp; if(response!=null){
&amp;nbsp;&amp;nbsp; /*responseProperties = new String[response.length()];
&amp;nbsp;&amp;nbsp; Iterator it=response.keys();
&amp;nbsp;&amp;nbsp; int i=0;
&amp;nbsp;&amp;nbsp; while(it.hasNext()){
&amp;nbsp;&amp;nbsp;&amp;nbsp; String key = (String)it.next();
&amp;nbsp;&amp;nbsp;&amp;nbsp; String value =&amp;nbsp; response.getString(key);
&amp;nbsp;&amp;nbsp;&amp;nbsp; //responseProperties&lt;I&gt;="\""+ key+"\":\""+value+"\"";
&amp;nbsp;&amp;nbsp;&amp;nbsp; responseProperties&lt;I&gt; = key + "=" + value;
&amp;nbsp;&amp;nbsp;&amp;nbsp; i++;
&amp;nbsp;&amp;nbsp; }*/
&amp;nbsp;&amp;nbsp; /*if(!response.isNull("Content-Type")&amp;amp;&amp;amp; response.getString("Content-Type")!=null)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; responseProperties[0]="\"Content-Type\":\""+response.getString("Content-Type")+"\"";*/
&amp;nbsp;&amp;nbsp; //responseProperties= new String[]{response.toString()};
&amp;nbsp; }
&amp;nbsp; JSONObject resp=new JSONObject();
&amp;nbsp; resp.put("Content-Type", "image/png");
&amp;nbsp; responseProperties = new String[]{resp.toString()};
&amp;nbsp; String ss=responseProperties[0];
&amp;nbsp; serverLog.addMessage(1, 800, ss);
&amp;nbsp; //convert response properties to String array
&amp;nbsp; /*if (!responsePropertiesMap.isEmpty())
&amp;nbsp; {
&amp;nbsp;&amp;nbsp; Set&amp;lt;String&amp;gt; keys = responsePropertiesMap.keySet();
&amp;nbsp;&amp;nbsp; Iterator&amp;lt;String&amp;gt; keysIterator = keys.iterator();
&amp;nbsp;&amp;nbsp; int i = 0;
&amp;nbsp;&amp;nbsp; while (keysIterator.hasNext())
&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; String key = keysIterator.next();
&amp;nbsp;&amp;nbsp;&amp;nbsp; String value = responsePropertiesMap.get(key);
&amp;nbsp;&amp;nbsp;&amp;nbsp; responseProperties&lt;I&gt; = key + "=" + value;
&amp;nbsp;&amp;nbsp;&amp;nbsp; i++;
&amp;nbsp;&amp;nbsp; }
&amp;nbsp; }*/
&amp;nbsp; 
&amp;nbsp; return operationOutput; 
 } 
&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/PRE&gt;&lt;DIV style="display:none;"&gt; &lt;/DIV&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 23 Jan 2013 04:57:48 GMT</pubDate>
      <guid>https://community.esri.com/t5/arcgis-enterprise-questions/soe-rest-web-service-how-to-return-different-mime/m-p/694596#M26630</guid>
      <dc:creator>prettyboy123123prettyboy123123</dc:creator>
      <dc:date>2013-01-23T04:57:48Z</dc:date>
    </item>
    <item>
      <title>Re: SOE REST Web Service - How to return different MIME content types? java</title>
      <link>https://community.esri.com/t5/arcgis-enterprise-questions/soe-rest-web-service-how-to-return-different-mime/m-p/694597#M26631</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;try see &lt;/SPAN&gt;&lt;A href="http://resources.arcgis.com/en/help/arcobjects-java/concepts/engine/index.html#//00010000075m000000"&gt;http://resources.arcgis.com/en/help/arcobjects-java/concepts/engine/index.html#//00010000075m000000&lt;/A&gt;&lt;SPAN&gt; ( How to use MIME types in REST SOE response )&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 23 Jan 2013 05:55:31 GMT</pubDate>
      <guid>https://community.esri.com/t5/arcgis-enterprise-questions/soe-rest-web-service-how-to-return-different-mime/m-p/694597#M26631</guid>
      <dc:creator>nicogis</dc:creator>
      <dc:date>2013-01-23T05:55:31Z</dc:date>
    </item>
  </channel>
</rss>

