简体   繁体   English

如何在angular2 ionic2应用程序中设置请求标头

[英]how to set request headers in angular2 ionic2 application

I am trying to set request headers in the http get request in an ionic2 application. 我试图在ionic2应用程序的http get请求中设置请求标头。 The service part of the code is 代码的服务部分是

import { Injectable } from '@angular/core';
import { Http, Headers, RequestOptions } from '@angular/http';
import { Observable } from 'rxjs/Rx';
import 'rxjs/add/operator/map';

// model
import { DataModel } from '../models/data.model';

@Injectable()
export class AuthService {

    constructor(private _http: Http){}

    private _url = 'https://sample.com/';

    /**
     * 
     * Request headers to set
     * Accept      : application/json
     * Content-Type: application/json
     * apiKey      : xxx
     * 
    */

    verify(): Observable<DataModel>{ 
        let headers = new Headers()
        headers.append('Accept', 'application/json'); 
        headers.append('Content-Type', 'application/json');
        headers.append('apiKey', 'xxx');

        const requestOptions = new RequestOptions({headers: headers});

        return this._http.get(this._url, requestOptions).map(data => data.json());
    }
}

Is this the proper way to implement request header. 这是实现请求标头的正确方法吗? As when I tried this on an application the response was 当我在应用程序上尝试此响应时

XMLHttpRequest cannot load https://testportal.betterplace.co.in/VishwasAPI/api/public/v2/panVerification/BKCPB8852J. 
Response for preflight has invalid HTTP status code 403
EXCEPTION: Response with status: 0  for URL: null

The request/response 请求/响应

/**
 * Response headers
 */
HTTP/1.1 403 Forbidden
Date: Tue, 14 Mar 2017 08:11:55 GMT
Server: Apache
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST, GET, DELETE, PUT
Access-Control-Max-Age: 1000
Access-Control-Allow-Headers: x-requested-with, Content-Type, origin, authorization, accept, client-security-token
Content-Length: 253
Keep-Alive: timeout=15
Connection: Keep-Alive
Content-Type: text/html; charset=iso-8859-1

/**
 * Request headers
 */
OPTIONS xxx HTTP/1.1
Host: xxx
Connection: keep-alive
Access-Control-Request-Method: GET
Origin: http://localhost:8100
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1
Access-Control-Request-Headers: apikey, content-type
Accept: */*
Referer: http://localhost:8100/
Accept-Encoding: gzip, deflate, sdch, br
Accept-Language: en-GB,en-US;q=0.8,en;q=0.6
AlexaToolbar-ALX_NS_PH: AlexaToolbar/alx-4.0.1

But when I tried this URL in Postman application with these request headers set, I get the proper response. 但是,当我在Postman应用程序中尝试使用已设置这些请求标头的URL时,得到了正确的响应。

GET /xxx HTTP/1.1
Host: sample.com
Accept: application/json
Content-Type: application/json
apiKey: xxx
Cache-Control: no-cache
Postman-Token: xxx

I am stuck at this point. 我被困在这一点上。

I did not see any mistake in your code.But you should try this code.it is working in my app. 我没有在您的代码中看到任何错误。但是您应该尝试使用此代码。它在我的应用程序中有效。

 getMethods(url:any) :Observable<Response>{
         let headers = new Headers();
        headers.append('Content-Type', 'application/json');  
        headers.append('x-token', localStorage.getItem('token'));  

      return this.http.get(`${API_URL2+url}`,{headers:headers})
                .map((res:Response)=>{
                         return res.json();})
                .catch((error:any)=>Observable.throw(error)||'server error');
    }

This is a CORS (cross-domain) issue. 这是一个CORS(跨域)问题。 Your browser (not Angular) is sending an OPTIONS request before sending the actual POST request. 您的浏览器(不是Angular)在发送实际的POST请求之前正在发送OPTIONS请求。 Effectively, your server discards the OPTIONS request as not authenticated (or 403 forbidden in your case). 实际上,您的服务器会丢弃未经身份验证的OPTIONS请求(在您的情况下为403禁止)。 Please read this answer for more info. 请阅读答案以获取更多信息。

Have you tried to set a 'content-type' header as 'application/x-www-form-urlencoded' or 'multipart/form-data'? 您是否尝试将“内容类型”标头设置为“ application / x-www-form-urlencoded”或“ multipart / form-data”? I think is would result in the browser not to send an OPTIONS request before sending the POST request. 我认为这将导致浏览器在发送POST请求之前不发送OPTIONS请求。 So, even if you solve the first problem (with the lack of OAuth header), you may still not be able to POST, because of the second problem. 因此,即使解决了第一个问题(缺少OAuth标头),由于第二个问题,您仍然可能无法进行POST。

You can get past CORS issues by installing the cordova Whitelist plugin 您可以通过安装cordova白名单插件来解决CORS问题

You can also try and install the Chrome Allow-Control-Origin extension . 您也可以尝试安装Chrome Allow-Control-Origin扩展程序

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM