wso2 am шлюз перенаправления запросов на отправку multipart / form-data

Я использую демонстрационный API, который получает файл и заметку как ввод multipart / form-data и отображает содержимое файла и заметки. Вот образец HTML, который правильно запускает API:

<html>   
  <body>
    <FORM action="http://cgi-lib.berkeley.edu/ex/fup.cgi" method="post">
      <P>Choose file: <INPUT type="file" name="upfile">
      <p>Note: <INPUT type="text" name="note">
      <p><INPUT type="submit" value="Send"> 
    </FORM>
  </body>
</html>

Теперь я пытаюсь создать управляемый API в издателе WSO2 APIM. Ниже приведены параметры, которые я заполнил:

введите здесь описание изображения

Я заменяю действие HTML, чтобы пройти через добавленный мной API:

<FORM action="http://ec2-52-48-93-41.eu-west-1.compute.amazonaws.com:8280/test" method="post">

Но теперь, когда я запускаю HTML, я получаю следующую ошибку от API:

cgi-lib.pl: Unknown Content-type: application/x-www-form-urlencoded; charset=UTF-8

Похоже, что шлюз WSO2 переадресовал запрос как application / x-www-form-urlencoded, а не как mulipart / form-data.

На основе следующего обсуждения загрузка файла данных из нескольких частей с использованием диспетчера API WSO2 ? Я пытался закомментировать

   <messageFormatter contentType="multipart/form-data"
        class="org.apache.axis2.transport.http.MultipartFormDataFormatter"/>
   <messageBuilder contentType="multipart/form-data"
        class="org.apache.axis2.builder.MultipartFormDataBuilder"/>

И замените их на

 <messageFormatter contentType="multipart/form-data" 
     class="org.wso2.carbon.relay.ExpandingMessageFormatter"/> 
 <messageBuilder contentType="multipart/form-data" 
     class="org.wso2.carbon.relay.BinaryRelayBuilder"/>

Затем перезапустил сервер, но это не повлияло на работу.

Любые идеи будут оценены по достоинству.

Некоторые сообщения журнала, которые я собрал. Целевой API отличается, но это также API multipart / form-data, который сбрасывает все, что получает.

Входящий запрос имеет тип содержимого multipart / form-data с длиной содержимого 292

DEBUG {org.apache.synapse.transport.http.headers} -  http-incoming-1 >> POST /test/1.0.0 HTTP/1.1 {org.apache.synapse.transport.http.headers}
DEBUG {org.apache.synapse.transport.http.headers} -  http-incoming-1 >> Host: ec2-52-48-93-41.eu-west-1.compute.amazonaws.com:8280 {org.apache.synapse.transport.http.headers}
DEBUG {org.apache.synapse.transport.http.headers} -  http-incoming-1 >> Connection: keep-alive {org.apache.synapse.transport.http.headers}
DEBUG {org.apache.synapse.transport.http.headers} -  http-incoming-1 >> Content-Length: 292 {org.apache.synapse.transport.http.headers}
DEBUG {org.apache.synapse.transport.http.headers} -  http-incoming-1 >> Cache-Control: max-age=0 {org.apache.synapse.transport.http.headers}
DEBUG {org.apache.synapse.transport.http.headers} -  http-incoming-1 >> Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 {org.apache.synapse.transport.http.headers}
DEBUG {org.apache.synapse.transport.http.headers} -  http-incoming-1 >> Origin: null {org.apache.synapse.transport.http.headers}
DEBUG {org.apache.synapse.transport.http.headers} -  http-incoming-1 >> Upgrade-Insecure-Requests: 1 {org.apache.synapse.transport.http.headers}
DEBUG {org.apache.synapse.transport.http.headers} -  http-incoming-1 >> User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36 {org.apache.synapse.transport.http.headers}
DEBUG {org.apache.synapse.transport.http.headers} -  http-incoming-1 >> Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryqwBdAwOnlDYeHNNR {org.apache.synapse.transport.http.headers}
DEBUG {org.apache.synapse.transport.http.headers} -  http-incoming-1 >> Accept-Encoding: gzip, deflate {org.apache.synapse.transport.http.headers}
DEBUG {org.apache.synapse.transport.http.headers} -  http-incoming-1 >> Accept-Language: en-US,en;q=0.8,he;q=0.6 {org.apache.synapse.transport.http.headers}
DEBUG {org.apache.synapse.transport.http.headers} -  http-incoming-1 >> Cookie: region3_registry_menu=visible; region1_manage_menu=visible; region1_identity_menu=visible; menuPanel=visible; menuPanelType=main; csrftoken=n1g69f3slt1d90qvtaa28rtm1b {org.apache.synapse.transport.http.headers}

Исходящий запрос не имеет типа содержимого:

DEBUG {org.apache.synapse.transport.http.headers} -  http-outgoing-1 >> POST /sample2/api/company/upload HTTP/1.1 {org.apache.synapse.transport.http.headers}
DEBUG {org.apache.synapse.transport.http.headers} -  http-outgoing-1 >> Cookie: region3_registry_menu=visible; region1_manage_menu=visible; region1_identity_menu=visible; menuPanel=visible; menuPanelType=main; csrftoken=n1g69f3slt1d90qvtaa28rtm1b {org.apache.synapse.transport.http.headers}
DEBUG {org.apache.synapse.transport.http.headers} -  http-outgoing-1 >> Origin: null {org.apache.synapse.transport.http.headers}
DEBUG {org.apache.synapse.transport.http.headers} -  http-outgoing-1 >> Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 {org.apache.synapse.transport.http.headers}
DEBUG {org.apache.synapse.transport.http.headers} -  http-outgoing-1 >> Cache-Control: max-age=0 {org.apache.synapse.transport.http.headers}
DEBUG {org.apache.synapse.transport.http.headers} -  http-outgoing-1 >> Upgrade-Insecure-Requests: 1 {org.apache.synapse.transport.http.headers}
DEBUG {org.apache.synapse.transport.http.headers} -  http-outgoing-1 >> Accept-Encoding: gzip, deflate {org.apache.synapse.transport.http.headers}
DEBUG {org.apache.synapse.transport.http.headers} -  http-outgoing-1 >> Accept-Language: en-US,en;q=0.8,he;q=0.6 {org.apache.synapse.transport.http.headers}
DEBUG {org.apache.synapse.transport.http.headers} -  http-outgoing-1 >> Transfer-Encoding: chunked {org.apache.synapse.transport.http.headers}
DEBUG {org.apache.synapse.transport.http.headers} -  http-outgoing-1 >> Host: localhost:8080 {org.apache.synapse.transport.http.headers}
DEBUG {org.apache.synapse.transport.http.headers} -  http-outgoing-1 >> Connection: Keep-Alive {org.apache.synapse.transport.http.headers}
DEBUG {org.apache.synapse.transport.http.headers} -  http-outgoing-1 >> User-Agent: Synapse-PT-HttpComponents-NIO {org.apache.synapse.transport.http.headers}

Естественно, входящий ответ имеет HTTP 415, неподдерживаемый носитель:

DEBUG {org.apache.synapse.transport.http.headers} -  http-outgoing-1 << HTTP/1.1 415 Unsupported Media Type {org.apache.synapse.transport.http.headers}
DEBUG {org.apache.synapse.transport.http.headers} -  http-outgoing-1 << Server: Apache-Coyote/1.1 {org.apache.synapse.transport.http.headers}
DEBUG {org.apache.synapse.transport.http.headers} -  http-outgoing-1 << Content-Length: 0 {org.apache.synapse.transport.http.headers}
DEBUG {org.apache.synapse.transport.http.headers} -  http-outgoing-1 << Date: Mon, 28 Mar 2016 13:53:05 GMT {org.apache.synapse.transport.http.headers}
DEBUG {org.apache.synapse.transport.http.headers} -  http-incoming-1 << HTTP/1.1 415 Unsupported Media Type {org.apache.synapse.transport.http.headers}
DEBUG {org.apache.synapse.transport.http.headers} -  http-incoming-1 << Access-Control-Allow-Origin: * {org.apache.synapse.transport.http.headers}
DEBUG {org.apache.synapse.transport.http.headers} -  http-incoming-1 << Access-Control-Allow-Methods: POST {org.apache.synapse.transport.http.headers}
DEBUG {org.apache.synapse.transport.http.headers} -  http-incoming-1 << Access-Control-Allow-Headers: authorization,Access-Control-Allow-Origin,Content-Type {org.apache.synapse.transport.http.headers}
DEBUG {org.apache.synapse.transport.http.headers} -  http-incoming-1 << Date: Mon, 28 Mar 2016 13:53:05 GMT {org.apache.synapse.transport.http.headers}
DEBUG {org.apache.synapse.transport.http.headers} -  http-incoming-1 << Transfer-Encoding: chunked {org.apache.synapse.transport.http.headers}
DEBUG {org.apache.synapse.transport.http.headers} -  http-incoming-1 << Connection: keep-alive {org.apache.synapse.transport.http.headers}

Также стоит загрузить синапс API:

<?xml version="1.0" encoding="UTF-8"?>
<api xmlns="http://ws.apache.org/ns/synapse"
     name="admin--test"
     context="/test/1.0.0"
     version="1.0.0"
     version-type="context">
   <resource methods="POST" url-mapping="/*" faultSequence="fault">
      <inSequence>
         <filter source="$ctx:AM_KEY_TYPE" regex="PRODUCTION">
            <then>
               <property name="api.ut.backendRequestTime"
                         expression="get-property('SYSTEM_TIME')"/>
               <send>
                  <endpoint name="admin--test_APIproductionEndpoint_0">
                     <http uri-template="http://localhost:8080/sample2/api/company/upload"/>
                  </endpoint>
               </send>
            </then>
            <else>
               <sequence key="_sandbox_key_error_"/>
            </else>
         </filter>
      </inSequence>
      <outSequence>
         <class name="org.wso2.carbon.apimgt.usage.publisher.APIMgtResponseHandler"/>
         <send/>
      </outSequence>
   </resource>
   <handlers>
      <handler class="org.wso2.carbon.apimgt.gateway.handlers.security.CORSRequestHandler">
         <property name="apiImplementationType" value="ENDPOINT"/>
      </handler>
      <handler class="org.wso2.carbon.apimgt.gateway.handlers.security.APIAuthenticationHandler"/>
      <handler class="org.wso2.carbon.apimgt.gateway.handlers.throttling.APIThrottleHandler">
         <property name="policyKey" value="gov:/apimgt/applicationdata/tiers.xml"/>
         <property name="policyKeyApplication"
                   value="gov:/apimgt/applicationdata/app-tiers.xml"/>
         <property name="policyKey" value="gov:/apimgt/applicationdata/tiers.xml"/>
         <property name="policyKeyApplication"
                   value="gov:/apimgt/applicationdata/app-tiers.xml"/>
         <property name="id" value="A"/>
         <property name="policyKeyResource"
                   value="gov:/apimgt/applicationdata/res-tiers.xml"/>
      </handler>
      <handler class="org.wso2.carbon.apimgt.usage.publisher.APIMgtUsageHandler"/>
      <handler class="org.wso2.carbon.apimgt.usage.publisher.APIMgtGoogleAnalyticsTrackingHandler">
         <property name="configKey" value="gov:/apimgt/statistics/ga-config.xml"/>
      </handler>
      <handler class="org.wso2.carbon.apimgt.gateway.handlers.ext.APIManagerExtensionHandler"/>
   </handlers>
</api>

person Ofer Lahav    schedule 28.03.2016    source источник


Ответы (2)


По умолчанию похоже, что новый API Manager не сохраняет определенные заголовки от клиентов. Вам необходимо добавить следующее свойство http.headers.preserve = Content-Type в репозиторий / conf / passthru-http.properties для сохранения Content-Type заголовок.

person ajanthan    schedule 29.03.2016
comment
Это правильно. Я добавил: http.headers.preserve = Content-Length, Content-Type, чтобы сохранить как тип, так и длину (некоторые серверы полагаются на это), и теперь он работает. - person Ofer Lahav; 30.03.2016

Чтобы подчеркнуть ответ Аджантана, чтобы правильно сохранить заголовки, правильным изменением было бы добавить следующее в passthru-http.properties

http.headers.preserve=Content-Length,Content-Type

Это новая функция ESB 4.9.0, поэтому она мало документирована, но вы можете прочитать об этом в этом блоге: http://prabu-lk.blogspot.co.il/2015/09/how-to-preserving-http-headers-in-wso2.html

person Ofer Lahav    schedule 30.03.2016