如何在 React Native 中构造 POST 请求正文而不是字符串化的 json 而是 json?

Posted

技术标签:

【中文标题】如何在 React Native 中构造 POST 请求正文而不是字符串化的 json 而是 json?【英文标题】:How can I construct a POST request body in React Native not with a stringified json but a json? 【发布时间】:2017-12-21 17:11:21 【问题描述】:

我正在用 react native 替换一些本地代码。 Charles 中的预期 POST 请求(在 AFNetworking 中实现)应该是这样的:

代码sn-p:

NSError *err;
NSData *paramData = [NSJSONSerialization dataWithJSONObject:parameters options:NSJSONWritingPrettyPrinted error:&err];
NSData *paramData = [NSJSONSerialization dataWithJSONObject:parameters options:NSJSONWritingPrettyPrinted error:&err];   
NSString *paramString = [[NSString alloc] initWithData:paramData encoding:NSUTF8StringEncoding];
NSDictionary *param = @@"data":paramString;
AFHTTPRequestOperation *operation = [manager POST:URLString parameters:param success:^(AFHTTPRequestOperation *operation, id responseObject) 
    if (successBlock) 
        successBlock(responseObject);
    
 failure:^(AFHTTPRequestOperation *operation, NSError *error) 
    DebugLog(@"%zd", operation.response.statusCode);
    if (failureBlock) 
        failureBlock(operation, error);
    
];

但是Fetch API版本的请求是这样的:

代码sn-p:

export default async (url, param) => 
  var result = await fetch(url, 
    method: 'POST',
    headers: 
      'Accept': 'application/json',
      'Content-Type': 'text/html',
    ,
    body: JSON.stringify( 
      'data': JSON.stringify(param) 
    )
  )
  .then(response => checkStatus(response))
  .then(response => response.json())
  .catch(e =>  throw e; );

  return result;


我的问题是如何在fetch 中发送与AFNetworking 完全相同的帖子?这花费了我很多时间。谢谢!!

更新:主要区别在于烦人的斜杠及其body数据结构,原生的是json(data:paramString),而js是字符串。

【问题讨论】:

如果您想要返回 JSON 响应,是否有某些原因您要发送 Accept: text/html 请求标头?因为那是要求服务器向您发送 HTML 响应,对吗?不是 JSON…… 无需在body中对param进行字符串化 @Engineer,但是服务器 api 要求这个结构,正如你在我的 Objective-C 代码中看到的那样。 @sideshowbarker ,与请求无关,只定义响应数据。在text/html 中,在本机实现中效果很好。 【参考方案1】:

最后,我的同事找到了解决办法。请求正文应该这样构造:

body: 'data=' + JSON.stringify(param)

【讨论】:

以上是关于如何在 React Native 中构造 POST 请求正文而不是字符串化的 json 而是 json?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 fetch 中传递 POST 参数以在 React Native 中将图像上传到服务器?

如何创建 POST 请求以从本地路径将文件存储在服务器上 - React Native

如何使用 React Native POST 或 PUT 原始二进制文件

在 react-native 中发送请求标头/授权 axios.post

使用 axios 在 react-native 中使用 POST 方法获取 API 数据

如何在 React-Native 中获得键盘的高度?