これは、APIにリクエストを行うための私のコードです:
import 'Dart:async';
import 'Dart:convert';
import 'Dart:io';
import 'package:http/http.Dart' as http;
Future<http.Response> postRequest () async {
var url ='https://pae.ipportalegre.pt/testes2/wsjson/api/app/ws-authenticate';
var body = jsonEncode({ 'data': { 'apikey': '12345678901234567890' } });
print("Body: " + body);
http.post(url,
headers: {"Content-Type": "application/json"},
body: body
).then((http.Response response) {
print("Response status: ${response.statusCode}");
print("Response body: ${response.contentLength}");
print(response.headers);
print(response.request);
});
}
私はリクエストからの応答に問題がありますが、jsonでボディを持つと仮定していますが、何かが間違っていて、ネストされたjsonオブジェクトであるため、ボディリクエストで送信するjsonにあると思いますキーの値はjsonオブジェクトです。私はjsonを正しく解析してリクエストの本文に挿入する方法を知りたいです。
これはヘッダー応答です:
{set-cookie: JSESSIONID=DA65FBCBA2796D173F8C8D78AD87F9AD;path=/testes2/;HttpOnly, last-modified: Thu, 10 May 2018 17:15:13 GMT, cache-control: no-store, no-cache, must-revalidate, max-age=0, post-check=0, pre-check=0, date: Thu, 10 May 2018 17:15:13 GMT, content-length: 0, pragma: no-cache, content-type: text/html, server: Apache-Coyote/1.1, expires: Tue, 03 Jul 2001 06:00:00 GMT}
そして、これは次のように仮定されている方法です:
Server: Apache-Coyote/1.1
Expires: Tue, 03 Jul 2001 06:00:00 GMT
Last-Modified: Thu, 10 May 2018 17:17:07 GMT
Cache-Control: no-store, no-cache, must-revalidate, max-age=0, post-check=0, pre-check=0
Pragma: no-cache
Content-Type: application/json;charset=UTF-8
Vary: Accept-Encoding
Set-Cookie: JSESSIONID=84813CC68E0E8EA6021CB0B4C2F245BC;path=/testes2/;HttpOnly
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Transfer-Encoding: chunked
ボディレスポンスは空になりました。リクエストで送信したボディは、ネストされたjsonオブジェクトの値で誰でも私を助けることができますか?
OK、最後に答えがあります...
headers: {"Content-Type": "application/json"},
を正しく指定して、コンテンツタイプを設定しています。内部では、パッケージhttp
または下位レベルDart:io HttpClient
がこれをapplication/json; charset=utf-8
に変更しています。ただし、サーバーWebアプリケーションは、明らかにサフィックスを期待していません。
これを証明するために、2つのバージョンのJavaで試しました
conn.setRequestProperty("content-type", "application/json; charset=utf-8"); // fails
conn.setRequestProperty("content-type", "application/json"); // works
Webアプリケーションの所有者に連絡して、バグを説明できますか? Dartがサフィックスを追加している場所はわかりませんが、後で確認します。
EDIT後の調査で、http
パッケージが、あなたのために多くのうんざりする作業をしている間に、サーバーが嫌いなサフィックスを追加していることがわかりました。サーバーを修正できない場合は、http
をバイパスして、Dart:io HttpClient
を直接使用できます。通常、http
によって処理されるボイラープレートが少しあります。
以下の作業例:
import 'Dart:convert';
import 'Dart:io';
import 'Dart:async';
main() async {
String url =
'https://pae.ipportalegre.pt/testes2/wsjson/api/app/ws-authenticate';
Map map = {
'data': {'apikey': '12345678901234567890'},
};
print(await apiRequest(url, map));
}
Future<String> apiRequest(String url, Map jsonMap) async {
HttpClient httpClient = new HttpClient();
HttpClientRequest request = await httpClient.postUrl(Uri.parse(url));
request.headers.set('content-type', 'application/json');
request.add(utf8.encode(json.encode(jsonMap)));
HttpClientResponse response = await request.close();
// todo - you should check the response.statusCode
String reply = await response.transform(utf8.decoder).join();
httpClient.close();
return reply;
}
ユースケースによっては、リクエストごとに新しいものを作成し続けるよりも、HttpClientを再利用する方が効率的です。 Todo-エラー処理を追加;-)
これは動作します!
import 'Dart:async';
import 'Dart:convert';
import 'Dart:io';
import 'package:http/http.Dart' as http;
Future<http.Response> postRequest () async {
var url ='https://pae.ipportalegre.pt/testes2/wsjson/api/app/ws-authenticate';
Map data = {
'apikey': '12345678901234567890'
}
//encode Map to JSON
var body = json.encode(data);
var response = await http.post(url,
headers: {"Content-Type": "application/json"},
body: body
);
print("${response.statusCode}");
print("${response.body}");
return response;
}
これも動作します:
import 'package:http/http.Dart' as http;
sendRequest() async {
Map data = {
'apikey': '12345678901234567890'
};
var url = 'https://pae.ipportalegre.pt/testes2/wsjson/api/app/ws-authenticate';
http.post(url, body: data)
.then((response) {
print("Response status: ${response.statusCode}");
print("Response body: ${response.body}");
});
}
これはHTTPClientクラスを使用するためのものです
request.headers.add("body", json.encode(map));
エンコードされたJSONデータをヘッダーに添付して追加しました。わたしにはできる。