http.post 在 flutter 中返回 307 错误码

问题描述 投票:0回答:7

我正在使用http客户端进行flutter网络调用。

  1. 我的要求是让邮递员正确得到回复,
  2. 但是在尝试使用 http.post 时,它返回错误代码 307-临时重定向,

方法体:

static Future<http.Response> httpPost(
  Map postParam, String serviceURL) async {
Map tempParam = {"id": "username", "pwd": "password"};
var param = json.encode(tempParam);
serviceURL = "http:xxxx/Login/Login";

// temp check
Map<String, String> headers = {
  'Content-Type': 'application/json',
  'cache-control': 'no-cache',
};
await http.post(serviceURL, headers: headers, body: param).then((response) {
  return response;
});
}

此外,相同的代码还会返回对其他请求和 URL 的正确响应。 首先我尝试使用 chopper 客户端,但遇到了同样的问题。

我无法从服务器端检测到该问题。

任何帮助/提示都会有帮助

flutter
7个回答
16
投票

尝试在

/
的末尾添加斜线
serviceUrl
。因此,serviceUrl 是
serviceURL = "http:xxxx/Login/Login/"
而不是
serviceURL = "http:xxxx/Login/Login"

这对我有用。


1
投票

您需要找到一种方法来遵循重定向

也许邮递员正在这样做。

阅读此>> https://api.flutter.dev/flutter/dart-io/HttpClientRequest/followRedirects.html

您可以尝试使用

get
代替
post
吗?至少尝试看看发生了什么

在文档中说:

Automatic redirect will only happen for "GET" and "HEAD" requests
only for the status codes 

HttpStatus.movedPermanently (301), 
HttpStatus.found (302), 
HttpStatus.movedTemporarily (302, alias for HttpStatus.found), 
HttpStatus.seeOther (303),
HttpStatus.temporaryRedirect (307)

1
投票

@Abel 上面的答案是正确的,但我不得不从使用中切换:

Uri url = Uri.https(defaultUri, path);

Uri url = Uri.parse('https://todo-fastapi-flutter.herokuapp.com/plan/');

/
之后得到最后一个
plan

第一种方法不断丢失它,所以我收到了 307 错误。

flutter.dev 显示了完整的示例:

Future<http.Response> createAlbum(String title) {
  return http.post(
    Uri.parse('https://jsonplaceholder.typicode.com/albums'),
    headers: <String, String>{
      'Content-Type': 'application/json; charset=UTF-8',
    },
    body: jsonEncode(<String, String>{
      'title': title,
    }),
  );
}

此处:https://flutter.dev/docs/cookbook/networking/send-data#2-sending-data-to-server


1
投票

将 / 放在 URL 末尾对我有用。

示例: https://api.com/v1/book/list 给我一个临时重定向错误; 尽管, https://api.com/v1/book/list/有效。 (/在最后)


0
投票

在 URL 中保留 https 而不是 http,这对我很有帮助。


0
投票

对于 Dio Http 客户端,使用 Dio Option follow redirect as True

getDioOption(){
return BaseOptions(connectTimeout: 30, receiveTimeout: 30,
followRedirects: true);
}

0
投票

我确实遇到了这个问题,@Abel Rodríguez 解决方案有效。我不知道为什么会发生这种情况。如果有人有更多的见解并且可以解释一下吗?

© www.soinside.com 2019 - 2024. All rights reserved.