是的這是一個跨域問題。我建議你試試下面。
在無驗證類型中,「OPTIONS」動詞是否允許API使用? [1]驗證發送一個curl請求到沒有OAuth標頭的API。如果你得到一個你提到的CORS標題的200 OK響應,那應該沒問題。 例如:
curl -v -X OPTIONS http://localhost:8280/testapi
如果沒有返回成功信息,那麼你的後端可能不支持OPTIONS方法。您可以通過直接向您的後端服務發送OPTIONS請求來驗證。您可以在後端服務中啓用OPTIONS,也可以通過修改API突觸配置來避免OPTIONS調用到達後端。
例如: -
<api name="admin--TestAPI" context="/test" version="1.0" version-type="url">
<resource methods="POST GET OPTIONS DELETE PUT" url-mapping="/*">
<inSequence>
<filter source="get-property('axis2', 'HTTP_METHOD')" regex="OPTIONS">
<then>
<log level="custom">
<property name="Message" value="Received OPTIONS call, sending back headers"/>
</log>
<property name="Access-Control-Request-Headers" value="authorization,content-type" scope="transport"/>
<property name="Access-Control-Allow-Headers" value="authorization,Access-Control-Allow-Origin,Content-Type" scope="transport"/>
<property name="Access-Control-Allow-Methods" value="GET,POST,PUT,DELETE,OPTIONS" scope="transport"/>
<property name="Access-Control-Allow-Origin" value="*" scope="transport"/>
<property name="RESPONSE" value="true" scope="default" type="STRING"/>
<header name="To" action="remove"/>
<send/>
</then>
<else>
<property name="POST_TO_URI" value="true" scope="axis2"/>
<filter source="$ctx:AM_KEY_TYPE" regex="PRODUCTION">
<then>
<send>
<endpoint name="admin--StudentAPI_APIEndpoint_0">
<address uri="http://localhost:8080/sample/1.0/one/">
<timeout>
<duration>30000</duration>
<responseAction>fault</responseAction>
</timeout>
<suspendOnFailure>
<errorCodes>-1</errorCodes>
<initialDuration>0</initialDuration>
<progressionFactor>1.0</progressionFactor>
<maximumDuration>0</maximumDuration>
</suspendOnFailure>
<markForSuspension>
<errorCodes>-1</errorCodes>
</markForSuspension>
</address>
</endpoint>
</send>
</then>
<else>
<sequence key="_sandbox_key_error_"/>
</else>
</filter>
</else>
</filter>
</inSequence>
<outSequence>
<send/>
</outSequence>
</resource>
<handlers>
<handler class="org.wso2.carbon.apimgt.gateway.handlers.security.APIAuthenticationHandler"/>
<handler class="org.wso2.carbon.apimgt.gateway.handlers.throttling.APIThrottleHandler">
<property name="id" value="A"/>
<property name="policyKey" value="gov:/apimgt/applicationdata/tiers.xml"/>
</handler>
<handler class="org.wso2.carbon.apimgt.usage.publisher.APIMgtUsageHandler"/>
<handler class="org.wso2.carbon.apimgt.usage.publisher.APIMgtGoogleAnalyticsTrackingHandler"/>
<handler class="org.wso2.carbon.apimgt.gateway.handlers.ext.APIManagerExtensionHandler"/>
</handlers>
</api>
然後添加訪問控制允許來源以及對訪問控制允許報頭的列表,並保留其他標題,因爲它是。
例如:Access-Control-Allow-Headers: authorization,Access-Control-Allow-Origin,Content-Type
如果你仍然得到錯誤,可以提供詳細的錯誤信息或樣品PHP客戶端代碼?
[1] http://docs.wso2.org/display/AM160/Adding+Documentation+Using+Swagger
我試圖創建一個新的API與資源定義GET與應用程序和應用程序用戶和選項與auth類型無。我試過的其他APIS,在第一時間只有GET之後,我不得不修改添加OPTIONS動詞 現在我嘗試新的API,並收到500錯誤,我認爲現在它正在使用跨域的AM,但現在它出現在端點api服務器上。 – Zeravla
您現在面臨的問題是由於後端服務沒有正確支持OPTIONS請求,您可以通過直接向您的後端服務發送OPTIONS請求來驗證該請求,該請求將返回相同的500響應作爲解決方法,我們可以修改API synpase config在OPTIONS調用發生時發送迴應。我用這個解決方法更新了上述答案。 –