Angular 为什么request.ts中的serializeBody方法不在case string中转换JSON.stringify(this.body)?

Angular 为什么request.ts中的serializeBody方法不在case string中转换JSON.stringify(this.body)?,angular,angular-httpclient,Angular,Angular Httpclient,当我将string值传递给post方法时,该值未转换为JSON。 因此,我们无法在控制器中获取此值 我检查了以下代码并找到了值未转换的原因 但我不明白这种行为是正确的 apply(id:string):可观察{ 返回this.http.post( 请求_URL+'/applicationrequest', 身份证件 标题 ); } @ResponseBody @RequestMapping(value=“/applicationrequest”,method=RequestMethod.PO

当我将
string
值传递给post方法时,该值未转换为
JSON
。 因此,我们无法在控制器中获取此值

我检查了以下代码并找到了值未转换的原因

但我不明白这种行为是正确的

apply(id:string):可观察{
返回this.http.post(
请求_URL+'/applicationrequest',
身份证件
标题
);
}
@ResponseBody
@RequestMapping(value=“/applicationrequest”,method=RequestMethod.POST)
公共布尔应用(@RequestBody UUID id){
返回用例。应用(id);
}
我想知道为什么
string
不应该自动转换
JSON
。 如果要知道如何使用
httpClient
,我想知道正确的使用方法。 多谢各位

角度版本是8.1.0。 Java就是Java8。
Spring是5.1/Spring Boot 2.1

只是因为它们是两个完全不同的东西。Angular(或httpclient)无法神奇地知道端点需要或期望作为输入的确切内容


作为开发人员,生成与服务器接口匹配的http请求完全取决于您。

我的团队中有人也发现了这个问题,我们需要为所有只接受正文中字符串的http PUT/POST方法添加
JSON.stringify(…)
。我们生成的代理(我们使用Swagger)没有为我们添加这一点

实际问题如下所示:

/**
*将自由形式的主体转换为适合
*传输到服务器。
*/
serializeBody():ArrayBuffer | Blob | FormData | string | null{
//如果没有正文,则不需要序列化它。
if(this.body==null){
返回null;
}
//检查正文是否已序列化。如果已序列化,
//可以直接退回。
if(isArrayBuffer(this.body)| | isBlob(this.body)| | isFormData(this.body)||
typeof this.body==='string'){
归还这具尸体;
}
//检查主体是否是HttpUrlEncodedParams的实例。
if(this.body instanceof HttpParams){
返回此.body.toString();
}
//检查主体是对象还是数组,如果是,则使用JSON序列化。
if(typeof this.body=='object'| | typeof this.body==='boolean'||
Array.isArray(此.body)){
返回JSON.stringify(this.body);
}
//其他一切都依赖于toString()。
return(this.body as any).toString();
}
普通字符串将使用最后一个选项,并将作为普通字符串呈现,而不是通过
JSON.stringify

我创建了一个检查内容类型的函数,如果它被设置为
application/json
text/json
,并且主体是一个普通字符串,那么拦截器将调用
json.stringify
,以确保它是一个有效的json字符串。此拦截器如下所示:

从'@angular/core'导入{Injectable};
从'@angular/common/http'导入{HttpEvent,HttpHandler,HttpInterceptor,HttpRequest};
从“rxjs”导入{Observable};
@可注射()
导出类StringInterceptor实现HttpInterceptor{
拦截(请求:HttpRequest,下一步:HttpHandler):可观察{
if(typeof request.body=='string'){
const contentType=request.headers.get('Content-Type')
if(contentType=='application/json'| | contentType=='text/json'){
request=request.clone({
body:JSON.stringify(request.body)
});
}
}
返回next.handle(请求)
}
}
您还需要通过将
app.module.ts
中的以下代码(确保导入您的拦截器)添加到提供商注册中来注册拦截器:

    {
      provide: HTTP_INTERCEPTORS,
      useClass: StringInterceptor,
      multi: true
    },

还要确保删除自己的
JSON.stringify(…)
调用,以避免所有字符串都有过多的引号。

感谢您的回复。但是为什么
boolean
值总是转换成
JSON
?我不同意你的观点,因为当
内容类型
设置为
application/JSON
(或者
text/JSON
)时,很明显应该将主体序列化为JSON字符串。