2017-04-17 182 views
0

這是更常見的問題。當我使用IE11,Chrome,FireFox和IE10時,我的Swagger API工作正常,但我收到錯誤:failed to parse JSON/YAML,而我的swagger.inspec().state正在返回"rejected"IE10 Swagger錯誤無法解析JSON/YAML

這裏是我如何實例化我的客戶:

import { API_URI } from '../config/app_config'; // '/accountservice/swagger.json' 
import Swagger from 'swagger-client'; // "swagger-client": "^2.1.17" 

export const buildAccountServiceClient =() => { 
    const swagger = new Swagger({ 
    url: (!window.location.origin ? IE_API_URI : API_URI), 
    usePromise: true, 
    }); 

    // Reconfigure swagger client to override service path if we're using a reverse proxy: 
    // /accountservice/swagger.json -> /accountservice 
    // Originally tried setting basePath to null, undefined, and '', but that didn't work 
    let basePath; 
    if (API_URI.startsWith('/')) { 
    basePath = API_URI.substring(0, API_URI.lastIndexOf('/')); 
    swagger.then((client) => { 
     client.setBasePath(basePath); 
     if (typeof(window) !== 'undefined') { 
     // use current protocol, so either http or https 
     client.setSchemes([window.location.protocol.slice(0, -1)]); 
     } 
    }); 
    } 
    return swagger; 
}; 

我也使用這就是爲什麼我有API_URI沒有定義爲完整的URL,但只是路徑中的代理服務器。

爲什麼在IE10以外的所有其他瀏覽器中都能正常工作?

+0

哪個版本的Swagger UI?最新的3.0.x [不支持IE10](https://github.com/swagger-api/swagger-ui#browser-support)。 – Helen

+0

nope我正在使用'「swagger-client」:「^ 2.1.17」' 我在這裏添加了更多的上下文:https://github.com/swagger-api/swagger-js/issues/1018 –

回答

0

通過Swagger-JS源代碼在我的node_modules文件夾中潛水後。

我發現初始化方法是試圖抓住當前窗口位置「原點」以添加到傳遞給構造函數的url路徑的前面。

由於IE10窗口對象中沒有origin鍵,所以它將URL轉換爲undefined/swagger.json

爲了解決這個問題我做了以下變化:

node_modules/swagger-client/lib/client.js line:129

line 126 if(this.url && this.url.indexOf('http:') === -1 && this.url.indexOf('https:') === -1) { 
    line 127 // no protocol, so we can only use window if it exists 
    line 128 if(typeof(window) !== 'undefined' && window && window.location) { 
    line 129  this.url = window.location.protocol + "//" + window.location.host + this.url; 
    line 130 } 
    line 131 } 

在IE10中,窗口對象不包含名爲location.origin當其他瀏覽器做一個對象鍵。

所以,如果你想獲得這在IE10工作:

line 129 this.url = window.location.protocol + '//' + window.location.host + this.url; 

我貢納嘗試,並提交一個PR招搖修復此問題。

--UPDATE--

如果你不想等待PR經歷,需要在您的最終修復:

http://tosbourn.com/a-fix-for-window-location-origin-in-internet-explorer/

或者這裏是我的修補程序:

const API_URI = '/swagger.json'; 
const IE_API_URI = `${window.location.protocol}//${window.location.hostname}${(window.location.port ? `:${window.location.port}` : '')}/swagger.json`; 

const swagger = new Swagger({ 
    url: (!window.location.origin ? IE_API_URI : API_URI), 
    usePromise: true, 
});