禁用CORS的TeamCity Rest API调用 - axios获取请求

时间:2017-08-02 13:28:58

标签: rest reactjs cors teamcity axios

我尝试使用axios get请求将数据从我们的TeamCity服务器返回到我的React Web应用程序。遗憾的是,我无法在服务器上启用CORS并始终以401:未授权,或者使用'预检的响应无效(重定向)'错误。

我试图在标题中传递用户名和密码:

componentDidMount() {
var config = {
    "headers": {
    "username": "username",
    "password": "password"    
  }
}
// Make axios  http request to TeamCity server with authentication headers
axios.get('http://teamcity/app/rest', config)
 .then(res => res.json())
  .then(res => {
    // Transform the raw data by extracting the nested posts
    const projects = res.data.projects;

    // Update state to trigger a re-render.
    // Clear any errors, and turn off the loading indicator.
    this.setState({
      projects,
      loading: false,
      error: null
    });
  })
  .catch(err => {
    // Something went wrong. Save the error in state and re-render.
    this.setState({
      loading: false,
      error: err
    });
  });
 }

我已尝试按照此帖子在网址中传递用户名和密码: How to pass username and password in TeamCity REST API

http://user:pass@server/app/rest/

我还尝试从工作邮递员请求传递基本身份验证标头。

请求始终返回' XMLHttpRequest无法加载http://teamcity/app/rest。预检的响应无效(重定向)'

我与TeamCity服务器位于同一网络上。如果没有启用CORS,这可能吗?

1 个答案:

答案 0 :(得分:2)

您必须启用CORS。否则(即使TeamCity回复了一些数据),也无法在浏览器中访问响应。

一旦您在rest.cors.origins internal property中提供了正确的来源,例如

rest.cors.origins=http://myinternalwebpage.org.com:8080,https://myinternalwebpage.org.com

您还应通过添加以下内部属性来启用预检OPTIONS请求支持:

rest.cors.optionsRequest.allowUnauthorized=true

然后重启服务器。

The docs还建议使用/app/rest/latest,而不是/app/rest,并避免使用httpAuth前缀。

之后一切都应该正常,例如。

fetch('http://teamcity:8111/bs/app/rest/latest/builds?count=1', 
{
  headers: {
    'Authorization': 'Basic '+btoa('user:pass'),
    'Accept': 'application/json'
  }
})
.then(r => r.json())
.then(r => console.log(r))