如下有body体的POST jQ请求,在Angular里怎么写?

发布于 2022-09-12 04:46:46 字数 3036 浏览 17 评论 0

一. jQ写法(调用成功)

function myFunction(){
            $.ajax({
                url : 'http://124.11.11.11:63192/api/3.8/auth/signin',
                headers: {'content-type': 'text/xml'},
                data:'<tsRequest>' + '<credentials name="admin" password="ABC@2121" >' +
                    '<site contentUrl=""/>' + '</credentials>' + '</tsRequest>',
                type : 'post',
                crossDomain: true,
                   async : false,
                cache : false,
                success : function (res){
                    console.log('成功');
                }
        });
    }

二.Angular写法:(调用失败)

const defaultParams =
    '<tsRequest>' + '<credentials name="admin" password="ABC@2021" >' +
    '<site contentUrl=""/>' + '</credentials>' + '</tsRequest>'

export class SingerService {
    constructor(
        private http: HttpClient,
        @Inject(API_CONFIG_TABLEAU) private uri_tableau: string,
    ) { }

    getToken(args = defaultParams): Observable<any> {
        const params = new HttpParams({ fromString: queryString.stringify(args) });
        return this.http.post(
            this.uri_tableau + 'api/3.8/auth/signin',
            { params }).pipe(map(res => console.log(res))
        );
}

三.错误提示如下:

错误要点:
400 Bad Request","error":{"error":{"summary":"错误请求","detail":"Deserialization problem: Unrecognized field \"headers\" (class com.tableausoftware.api.rest.viewmodels.TsRequest), not marked as ignorable (35 known properties:

错误全部:
image

四.修改Angular版本(报错相同):

getToken(): Observable<any> {
    const headers = new HttpHeaders({responseType: 'text' , 'Content-Type': 'text/xml' }).set('Accept', 'text/xml');
    let body = '<tsRequest>' +
            '<credentials name="admin" password="DHC@2020" >' +
            '<site contentUrl=""/>' +
            '</credentials>' +
            '</tsRequest>';
    const hdr = {headers:headers , body:body};
    return this.http.post(this.uri_tableau + 'api/3.8/auth/signin', hdr)
.pipe(map(res => console.log(res)));
}

jQuery 请求 body 体截图:
image

Angular 请求 body 体截图:

image
【======================================================】
修改后:

 const headers = new HttpHeaders({responseType: 'text' , 'Content-Type': 'text/xml' }).set('Accept', 'text/xml');
 const body = '<tsRequest>' +
 '<credentials name="admin" password="DHC@2020" >' +
 '<site contentUrl=""/>' +
 '</credentials>' +
 '</tsRequest>';

 const hdr = { headers };
 return this.http.post(this.uri_tableau + 'api/3.8/auth/signin', body, hdr)
 .pipe(map(res => console.log(res)));

修改后报错如下:
image

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

痕至 2022-09-19 04:46:46

你 httpClient.post 参数传递错了吧。
post(url,body,options) request header 在 options 里设置。

https://angular.io/api/common...

更新,

你的 responseType 不能写到 request header 里,你服务器不认这个,不在跨域允许的 header 范围内。

﹎☆浅夏丿初晴 2022-09-19 04:46:46

HttpClient.post的原型是这样的:

 post<T>(url: string, body: any | null, options?: {

 headers?: HttpHeaders | {

 [header: string]: string | string[];

 };

 observe?: 'body';

 params?: HttpParams | {

 [param: string]: string | string[];

 };

 reportProgress?: boolean;

 responseType?: 'json';

 withCredentials?: boolean;

 }): Observable<T>;

post方法有三个参数,body和headers不要放在一起

getToken(): Observable<any> {
const headers = new HttpHeaders({responseType: 'text' , 'Content-Type': 'text/xml' }).set('Accept', 'text/xml');
let body = '<tsRequest>' +
            '<credentials name="admin" password="DHC@2020" >' +
            '<site contentUrl=""/>' +
            '</credentials>' +
            '</tsRequest>';
const hdr = {headers:headers };
return this.http.post(this.uri_tableau + 'api/3.8/auth/signin', body,hdr)
.pipe(map(res => console.log(res)));
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文