当前位置: 首页 > 知识库问答 >
问题:

如何发送邮递员般的,应用程序/x-www-form-urlencoded帖子请求角

郁权
2023-03-14

我为Django API项目编写了一个基于angular的客户端应用程序。其中一个endpoint接受application/x-www-form-urlencoded格式的请求,因为它同时包含文件和字符串数据,我很确定它在服务器端工作正常——我已经使用POSTMAN准备了一个application/x-www-form-urlencoded请求:

HEADERS:
   Content-Type: application/x-www-form-urlencoded
BODY (form-data):
   experiment: http://127.0.0.1:8000/api/v1/experiments/6/
   measurement: http://127.0.0.1:8000/api/v1/measurements/4/
   variable: 
   x_axis: X_AXIS
   y_axis: Y_AXIS
   file_object: // here I've changed the field type and chose the .txt file

当然,服务器响应正确,并且已添加文件。以下是确切请求正文的样子:

experiment=http://127.0.0.1:8000/api/v1/experiments/6/measurement=http://127.0.0.1:8000/api/v1/measurements/4/variable=x_axis=os Xy_axis=os Yfile_obj=[object Object]

但是现在,事情变得越来越复杂。我尝试使用反应式表单和HttpClient在Angular中准备相同的请求。假设反应式表单本身正常工作,但发送设置为“Content-Type”的请求:

  • “application/x-www-form-urlencoded”返回“500内部服务器错误”,并且
  • “多部分/数据表单”返回“415不支持的媒体类型”

以下是我发送请求的方式:

post(formGroup: FormGroup): Observable<DataFile> {
    const httpOption = {
      headers: new HttpHeaders({
        'Content-Type': 'application/x-www-form-urlencoded'
      })
    };

    return this.httpClient.post<DataFile>(this.apiEndpoints.datafilesCreateEndpoint(), formGroup.value, httpOption);
  }

下面是确切的请求:

{"experiment":"http://127.0.0.1:8000/api/v1/experiments/6/","measurement":"http://127.0.0.1:8000/api/v1/measurements/4/","variable":" ","x_axis":"X AXIS","y_axis":"Y AXIS","file_obj":"C:\\fakepath\\navon.txt"}

当我将Content-Type设置为不同的内容类型时,不知道为什么请求的表单数据是JSON。这可能是这个问题的原因吗?

@更新解决方案

我已经从post函数中删除了httpOptions,让Angular自动传递内容类型。然后,而不是通过FormGroup。对于httpClient的帖子,我创建了FormData,并将其传递给了其他人。

以下是我的POST函数的外观:

post(experiment: SharedModel, measurement: SharedModel, andOtherDataINeed: any): Observable<DataFile> {

    const fd = new FormData();
    fd.append('experiment', experiment as any);
    ...
    fd.append('file_obj', file);

    return this.httpClient.post<DataFile>(this.apiEndpoints.datafilesCreateEndpoint(), fd);

共有2个答案

华季同
2023-03-14

将原始代码更改为

    return this.httpClient.post<DataFile>(this.apiEndpoints.datafilesCreateEndpoint(), new HttpParams({ fromObject: formGroup.value }));

FormData作为multipart/form data发送,而不是作为application/x-www-form-urlencoded发送。

施永宁
2023-03-14

尝试研究Axios库https://github.com/axios/axios

如果您向下滚动,您会注意到您需要的示例。您可以毫无问题地在Angular应用程序中使用Axios。

 类似资料:
  • 在java中,如何使用。我不明白如何发送带有键值的正文,如上面的屏幕截图所示。 我尝试过以下代码: 但是在回复中,我没有收到正确的数据。

  • 我正在尝试使用,但数据没有到达PHP。我认为这是因为当使用标题始终设置为

  • 我试图用application/x-www-form-urlencoded设置一个http head manager元素;Charset=UTF-8“;param。我从postman获得所需的结果,但是这个设置有一个复选框。我需要对rest api项目使用JMeter。

  • 问题内容: 我有一些要以表单编码形式发布到服务器的参数: 我正在这样发送我的请求(当前没有参数) 如何在请求中包含表单编码的参数? 问题答案: 对于上载表单编码的POST请求,我建议使用FormData对象。 示例代码:

  • 我有一个api要求在标题中发送以下参数- 内容类型-应用程序/x-www. form-urlencoded AuthKey-(会话令牌) 以及正文中的以下参数(表单日,即键值对) storeId-1 类型-产品 类别ID-324 但是每当我点击这个api,我总是得到401(未授权)错误。我已经尝试使用MultipartRequest正文和formBody,我知道这与正文无关(它的头,我需要发送内容

  • 我试图使用以下客户端代码调用REST服务,目的是发送一些字符串消息详细信息以及附件文件: 我的目标服务器接受Base64编码的内容,这就是为什么额外的从文件传输到ByteArray的原因。 此外,我发现类com.sun.jersey.core.impl.provider.entity.FormProvider用于生产和消费“x-www-form-urlencoded”请求。 但我还是得出了以下结论