- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我目前正在尝试使用 Angular 2(通过 Ionic 2)应用访问 API。我们的 laravel 后端以这样一种方式设置,即它需要一个带有请求内容类型的 Accept header ,并且没有 Content-Type header 。不仅仅是一个空的 Content-Type header ,而是根本没有。
因此,我在 Http 中设置了必要的参数,在 header 中省略了 Content-Type,这就是问题开始的地方:Angular 2 显然不能将其手从 Content-Type 上移开。如果我给它一个对象作为请求的主体,它会将 Content-Type 设置为 application/json。这仍然是可以理解的。然后我将对象字符串化,这导致 Angular 将 Content-Type 设置为 text/plain。尝试,通过
headers = new Header({Accept: 'application/json', Content-Type: undefined});
或
headers.append("Content-Type", undefined);
或我能想象到的包含 application/json 的 Accept 的任何 header 的任何其他组合,即使 headers.set 或 headers.delete 失败,Angular 2 也会继续做它的事情。
在其他地方建议将 Content-Type 设置为 undefined,我也尝试将其设置为空字符串,在传入字符串化 JSON 时设置为 application/json,Angular 只是不给飞行 f...关于什么我想。有没有办法关闭这种自动化?我是否仍然做错了什么(我正在导入 header ,也就是缺少 header ,这是其他地方的问题,所以应该排除)?
代码如下:
import { Injectable, Inject } from '@angular/core';
import { Http, Headers, RequestOptions } from '@angular/http';
import 'rxjs/add/operator/toPromise';
import { ConfsService } from '../confs/confs.service';
import { ApiRequestBody } from './api.request.body';
@Injectable()
export class ApiService {
constructor(public confs: ConfsService, private apiRequestBody: ApiRequestBody, private http: Http) {
post (method: string, data: any):Promise<any> {
const api = this.confs.get().api;
const url = api['server'] + "" + api[method];
let allParams = this.apiRequestBody.toJSON(data);
let body = JSON.stringify(allParams);
let headers = new Headers({
'Accept': 'application/json',
'Content-Type': undefined,
});
let options = new RequestOptions({ headers: headers });
let obj = this.http.post(url, body, options).toPromise();
return obj;
}
}
ConfsService 只获取几个配置参数,也就是 api 服务器 URL,而 ApiRequestBody 获取一个服务,该服务创建一组标准参数,API 甚至需要查看请求,除了那些传入的参数通过数据参数(然后合并到 toJSON 方法中的标准参数中)——没有火箭科学。我正在做一个 toPromise() 因为我发现在这种特殊情况下的 promise 更容易处理。
最佳答案
在深入研究 Angular 源代码后,我得出结论,这是不可能的。请参阅 static_request.ts ( https://github.com/angular/angular/blob/5293794316cc1b0f57d5d88b3fefdf6ae29d0d97/packages/http/src/static_request.ts ),它将首先检查您是否手动将 header 设置为特定字符串,未定义或空字符串将落入 detectContentTypeFromBody 函数,如果您的请求正文是,该函数将仅设置 ContentType.NONE无效的。
/**
* Returns the content type enum based on header options.
*/
detectContentType(): ContentType {
switch (this.headers.get('content-type')) {
case 'application/json':
return ContentType.JSON;
case 'application/x-www-form-urlencoded':
return ContentType.FORM;
case 'multipart/form-data':
return ContentType.FORM_DATA;
case 'text/plain':
case 'text/html':
return ContentType.TEXT;
case 'application/octet-stream':
return this._body instanceof ArrayBuffer ? ContentType.ARRAY_BUFFER : ContentType.BLOB;
default:
return this.detectContentTypeFromBody();
}
}
/**
* Returns the content type of request's body based on its type.
*/
detectContentTypeFromBody(): ContentType {
if (this._body == null) {
return ContentType.NONE;
} else if (this._body instanceof URLSearchParams) {
return ContentType.FORM;
} else if (this._body instanceof FormData) {
return ContentType.FORM_DATA;
} else if (this._body instanceof Blob) {
return ContentType.BLOB;
} else if (this._body instanceof ArrayBuffer) {
return ContentType.ARRAY_BUFFER;
} else if (this._body && typeof this._body === 'object') {
return ContentType.JSON;
} else {
return ContentType.TEXT;
}
}
更新:
看起来实际上可以通过扩展 Request 并重载 detectContentType 函数以返回 0。这需要访问非公共(public)代码,但它可能会在未来中断:
import {Http, Headers, RequestOptions, RequestMethod, Request, BaseRequestOptions, Response} from '@angular/http';
import { ContentType } from '@angular/http/src/enums';
import { RequestArgs } from '@angular/http/src/interfaces';
class NoContentRequest extends Request {
constructor(args: RequestArgs) {
super(args);
}
detectContentType(): ContentType {
return 0;
}
}
const headers = new Headers({Accept: 'application/json'});
const request = new NoContentRequest({
method: RequestMethod.Post,
url: 'https://www.example.com/example',
responseType: ResponseContentType.Json,
headers: headers,
body: body
});
this._http.request(request)
.catch((error: Response | any) => { console.error(error); return Observable.throw(error); })
.first()
.subscribe();
关于javascript - 我如何告诉 Angular 2 停止自动设置 Content-Type header ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41448070/
我在让“@header”或任何其他@规则在ANTLR中工作时遇到麻烦。具有非常基本的语法,如下所示: grammar test; options { language = CSharp2;
我对来源和寄宿有疑问 我有一个ajax页面“Page A”,它将称为ajax提要“Page B” 我看到来自ajax调用的“页面B”的请求 header 具有源“http://mydomain.com
我在 pandas 中使用了数据透视表并获得了所需的数据框格式,但现在我有两行标题。数据透视表后的结果数据框如下: scenario Actual Plan
我在 pandas 中使用了数据透视表并获得了所需的数据框格式,但现在我有两行标题。数据透视表后的结果数据框如下: scenario Actual Plan
我想在主机将它们发送到网络之前修改数据包头(IP 头、TCP 头)。 例如,如果我使用 firefox 进行浏览,那么我想拦截所有来自 firefox 的数据包并修改 IP/TCP header ,然
我的 header 内容被包装到#header 中,但是当我设置边框显示结构时,它显示我的#header 的内容出现在#header 本身之后。可能是什么问题?这是我的代码: #header { bo
我是一名 Web 开发人员,使用过 PHP 和 .NET。有一年多的 Web 工作经验,我一直无法彻底了解浏览器缓存功能,希望这里的 Web Gurus 可以帮助我。我心中的问题是: 浏览器实际上是如
伙计们,我有一个问题,我不知道如何在一个 header 中连接多个 header ,我们称它为“主 header ”并使用该 header 中的函数,例如 // A.h #include class
我有一个包含 SOAP 消息的 XMLHTTPRequest。 我想添加用于标识消息并将由 C# Web 服务使用的 guid。 GUID 的目标是识别特定用户,并应护送所有用户请求以在服务器上进行身
我一直在阅读粘性标题,这是我目前所发现的。第一个粘性 header 效果很好,但是当它遇到第一个 header 时,我如何向上滚动第一个 header 并使第二个 header 卡住? http://
我想将当前基于 TableView 的数据网格转换为新的 UICollectionView 类。 这就是我当前的网格的样子: 我的网格有两个标题: 年份(2006a、2007a 等)和 类型(“收入”
我目前正在使用 Apollo 服务器。我正在尝试在响应 header 中设置一个属性。并且此属性是从客户端 graphQL 请求 header 中检索的。 我在网上查了一下。并看到了诸如使用插件或扩展
我的 Controller 的方法需要设置一个标题,例如X-Authorization .创建新对象( store Action )后,我执行转发以显示新创建的对象( show Action ): $
我正在研究一些关于 VLAN 的事情,发现了 VLAN 标签 和 header 。 如果我们有标准 802.3 以太网帧 的 MTU(1518 字节), header 802.3 中包含什么? 另外,
我是放心和 Java 的新手,我正在尝试做一个非常基本的测试来检查 API 的响应是否为 200 ok。 谁能告诉我我需要在下面的脚本中更改什么才能传递多个 header Id、Key 和 ConId
在我的项目中,我需要知道 zlib header 是什么样的。我听说它相当简单,但我找不到 zlib header 的任何描述。 例如,它是否包含魔数(Magic Number)? 最佳答案 zlib
我正在使用 JMeter 测试 HTTP 服务器,该服务器接受并验证 APIKey 并在成功时返回一个有时限的 token 。如果我有 token ,我想发送一个 token ;如果没有,我想发送一个
以太网 header 是什么样的? 是吗: 1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|
我们的应用程序支持 CORS 配置 header 。我在两个不同的主机上分别配置了 testApp。两种设置都相互独立工作。host1 上的应用程序配置有 CORS header Access-Con
tlhelp32.h 不包含 windows.h 本身是有原因的吗?我一直在与大量的编译器错误作斗争,因为我在包含 tlhelp32.h 之后包含了 windows.h。这是设计决定还是出于什么原因?
我是一名优秀的程序员,十分优秀!