2016-11-22 10 views
0

У меня есть набор экранов пользовательского интерфейса, написанные в Angularjs, какие шаги через пример заказа клиента 1. получает клиент 2. получает продукты 3. создает заказHTTP сообщение с запросом POST не принимается каждый раз, когда в Mulle при использовании CORS

UI и Mule сконфигурированы для совместного использования ресурсов Cross Origin (CORS), и HTTP GET работает правильно, но HTTP POST-запрос отображается в консоли Chrome DevTools Network как ошибка и был отменен.

Когда я запускаю Mule в режиме отладки, HTTP-запрос POST не поступает каждый раз из пользовательского интерфейса, и чаще всего мне нужно дважды выполнить три шага заказа клиента, чтобы увидеть запрос POST, инициирующий рабочий процесс создания заказа, который появляется завершается успешно при срабатывании. Каждый раз, хотя вызов POST отображается как отмененный в Chrome DevTools.

Кто-нибудь знает, что может быть причиной этого поведения и как получить сообщение POST для запуска рабочего процесса Mule каждый раз?

Я не уверен, что сообщение OPTIONS, которое отправлено как часть процедуры CORS, не запускает POST из-за чего-то в коде Mule и причина, по которой он работает второй раз, потому что ответ OPTIONS был кэширован так он сразу же отправляет запрос POST или есть что-то еще.

XML Flow:

<?xml version="1.0" encoding="UTF-8"?> 
<mule xmlns:tracking="http://www.mulesoft.org/schema/mule/ee/tracking" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:cors="http://www.mulesoft.org/schema/mule/cors" xmlns:apikit="http://www.mulesoft.org/schema/mule/apikit" xmlns:http="http://www.mulesoft.org/schema/mule/http" xmlns:spring="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd 
http://www.mulesoft.org/schema/mule/cors http://www.mulesoft.org/schema/mule/cors/current/mule-cors.xsd 
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd 
http://www.mulesoft.org/schema/mule/apikit http://www.mulesoft.org/schema/mule/apikit/current/mule-apikit.xsd 
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 
http://www.mulesoft.org/schema/mule/ee/tracking http://www.mulesoft.org/schema/mule/ee/tracking/current/mule-tracking-ee.xsd"> 
    <apikit:config name="test-order-config" raml="test-order.raml" consoleEnabled="true" consolePath="console" doc:name="Router"> 
     <apikit:flow-mapping resource="/orders/order" action="post" content-type="application/json" flow-ref="post:/orders/order:test-order-config"/>  
    </apikit:config> 

    <cors:config name="Cors_Configuration" doc:name="Cors Configuration"> 
     <cors:origins> 
      <cors:origin url="*"> 
       <cors:methods> 
        <cors:method>POST</cors:method> 
        <cors:method>DELETE</cors:method> 
        <cors:method>PUT</cors:method> 
        <cors:method>GET</cors:method> 
        <cors:method>OPTIONS</cors:method> 
       </cors:methods> 
       <cors:headers> 
        <cors:header>Content-Type</cors:header> 
       </cors:headers> 
      </cors:origin> 
     </cors:origins> 
    </cors:config> 

    <flow name="test-order-main"> 
     <http:listener config-ref="HTTP_Experience_Listener_Configuration" path="/*" doc:name="HTTP"/> 
     <cors:validate config-ref="Cors_Configuration" publicResource="true" acceptsCredentials="false" doc:name="CORS Validate"/> 
     <apikit:router config-ref="test-order-config" doc:name="APIkit Router"/>    
     <exception-strategy ref="test-order-apiKitGlobalExceptionMapping" doc:name="Reference Exception Strategy"/> 
    </flow> 

    <flow name="set-access-control-allow"> 
     <set-property propertyName="Access-Control-Allow-Origin" value="*" doc:name="Set Access Control Allow Origin"/> 
     <set-property propertyName="Access-Control-Allow-Credentials" value="false" doc:name="Set Access Control Allow Credentials"/> 
     <set-property propertyName="Access-Control-Allow-Methods" value="GET,HEAD,PUT,PATCH,POST,DELETE,OPTIONS" doc:name="Set Access Control Allow Methods"/> 
     <set-property propertyName="Access-Control-Allow-Headers" value="DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,origin,authorization,accept,client-security-token" doc:name="Set Access Control Allow Headers"/> 
    </flow> 

    <flow name="get:/products:test-order-config"> 
     <set-payload value="#['{ &quot;getProducts&quot;: { &quot;productsList&quot;: [{ &quot;productId&quot;: &quot;001&quot;, &quot;name&quot;: &quot;test_product1&quot;}]}}']" doc:name="Set Payload"/> 
     <flow-ref name="set-access-control-allow" doc:name="set-access-control-allow"/> 
     <logger message="#[payload]" level="INFO" doc:name="Logger"/> 
    </flow> 

    <flow name="get:/customer/{customerId}:test-order-config"> 
     <set-payload value="#['{&quot;getCustomer&quot;:{&quot;customerId&quot;:&quot;1234567890&quot;,&quot;title&quot;:&quot;MR&quot;,&quot;Name&quot;:&quot;John&quot;}}']" doc:name="Set Payload"/> 
     <flow-ref name="set-access-control-allow" doc:name="set-access-control-allow"/> 
     <logger message="#[payload]" level="INFO" doc:name="Logger"/> 
    </flow> 

    <flow name="post:/orders/order:test-order-config"> 
     <set-payload value="#['{&quot;createOrder&quot;:{&quot;orderId&quot;:&quot;8a493ecd-e842-4ca2-b33b-a03aa9136673&quot;,&quot;success&quot;:true}}']" doc:name="Set Payload"/> 
     <flow-ref name="set-access-control-allow" doc:name="set-access-control-allow"/> 
     <logger message="#[payload]" level="INFO" doc:name="Logger"/> 
    </flow> 

    <apikit:mapping-exception-strategy name="test-order-apiKitGlobalExceptionMapping"> 
     <apikit:mapping statusCode="404"> 
      <apikit:exception value="org.mule.module.apikit.exception.NotFoundException"/> 
      <set-property propertyName="Content-Type" value="application/json" doc:name="Property"/> 
      <set-payload value="{ &quot;message&quot;: &quot;Resource not found&quot; }" doc:name="Set Payload"/> 
     </apikit:mapping> 
     <apikit:mapping statusCode="405"> 
      <apikit:exception value="org.mule.module.apikit.exception.MethodNotAllowedException"/> 
      <set-property propertyName="Content-Type" value="application/json" doc:name="Property"/> 
      <set-payload value="{ &quot;message&quot;: &quot;Method not allowed&quot; }" doc:name="Set Payload"/> 
     </apikit:mapping> 
     <apikit:mapping statusCode="415"> 
      <apikit:exception value="org.mule.module.apikit.exception.UnsupportedMediaTypeException"/> 
      <set-property propertyName="Content-Type" value="application/json" doc:name="Property"/> 
      <set-payload value="{ &quot;message&quot;: &quot;Unsupported media type&quot; }" doc:name="Set Payload"/> 
     </apikit:mapping> 
     <apikit:mapping statusCode="406"> 
      <apikit:exception value="org.mule.module.apikit.exception.NotAcceptableException"/> 
      <set-property propertyName="Content-Type" value="application/json" doc:name="Property"/> 
      <set-payload value="{ &quot;message&quot;: &quot;Not acceptable&quot; }" doc:name="Set Payload"/> 
     </apikit:mapping> 
     <apikit:mapping statusCode="400"> 
      <apikit:exception value="org.mule.module.apikit.exception.BadRequestException"/> 
      <set-property propertyName="Content-Type" value="application/json" doc:name="Property"/> 
      <set-payload value="{ &quot;message&quot;: &quot;Bad request&quot; }" doc:name="Set Payload"/> 
     </apikit:mapping> 
    </apikit:mapping-exception-strategy> 

</mule> 

Chrome DevTools показывает заголовки запросов как временные в POST называют это показывает, как отменили, хотя иногда получает запрос Mule и обрабатываются корректно.

enter image description here

enter image description here

enter image description here

enter image description here

HTTP POST вызов в angularjs код:

postContent: function (link, data) { 
      $http({ 
       method: 'POST', 
       url: link, 
       headers: {'Content-Type':'application/json'}, 
       data: angular.toJson(data) 
      }).success(function (responseData) { 
       //do stuff with response 
       var returnData = responseData; 
      }).error(function (e) { 
       //do stuff with response 
       var error = e; 
      }); 
     } 
+0

Посмотрите на Консоль, у него должно быть сообщение об ошибке, сообщающее вам, почему браузер отменил запрос POST после получения ответа на запрос OPTIONS. – Quentin

+0

Привет - Я добавил скриншот с консоли и, похоже, не было ошибки. Где-нибудь еще я должен смотреть? – user3165854

ответ

0

Просто добавьте OPTIONS в уполномоченных запросов:

<cors:methods> 
    <cors:method>OPTIONS</cors:method> 
</cors:methods> 

EDIT ОП также пришлось удалить заголовок Content-type из его $http вызова, это то, что все комментарии о.

+0

Я обновил код (см. Выше), но я все еще получаю проблему, когда запрос POST не принимается в Mule каждый раз, и я должен повторить шаги как минимум (обычно) дважды, чтобы получить сообщение POST в рабочий процесс. – user3165854

+0

Не могли бы вы также опубликовать снимок экрана вкладки сети в консоли браузера? – trichetriche

+0

Добавлены скриншоты по запросу – user3165854