我尝试使用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,这可能吗?
答案 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))