JSONデータを受け取り、zipファイルを返すAPIエンドポイント(http://ogre.adc4gis.com/convertJson)を消費するのは苦労しています。 http://ogre.adc4gis.comには、apiが期待するパラメータが表示されます。HttpClientを使用してJSONをエンドポイントにポストするときに一定のBadRequestが発生する
Postmanを使ってJavascriptを使っているので、私のC#コードで何が間違っているのか不思議です。
このAPIにポストすることができる。例えばJSON文字列、:
{
"displayFieldName": "NUM_GES2_1",
"fieldAliases": {
"NUM_GES2_1": "NUM_GES2_1"
},
"geometryType": "esriGeometryPoint",
"spatialReference": {
"wkid": 102362,
"latestWkid": 4647
},
"fields": [{
"name": "NUM_GES2_1",
"type": "esriFieldTypeString",
"alias": "NUM_GES2_1",
"length": 254
}],
"features": [{
"attributes": {
"NUM_GES2_1": "001-08"
},
"geometry": {
"x": 32674408.2009,
"y": 5790291.4659000002
}
}]
}
completenesの便宜上、これは特注のAPIへの呼び出しを呼び出すアクションメソッド、次のとおりです。
[HttpGet]
[Route("{id:int}/Attributive")]
public async Task<IActionResult> GetFeatureClass(int id)
{
var client = new HttpClient();
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
//get token from internal api
var token = await _tokenService.RefreshToken();
//dummy address that returns a single object for development
var tokenObjString = await client.GetStringAsync(
$"http://url.to/MapServer/{id}/query?where=1%3D1&objectIds=4&f=pjson&token={token}"
);
var data = await PostDataToOgrService(tokenObjString);
var response = File(data, "application/octet-stream", "FeatureClass.Zip");
return response;
}
ここで、APIへの実際の呼び出しが行われる部分があります。 ペイロードはエスケープされたjson文字列です。すべてのエスケープを取り除き、オブジェクトに変換してからもう一度やり直しています。
public async Task<byte[]> PostDataToOgrService(string payload)
{
var client = new HttpClient();
var newJson = JsonConvert.DeserializeObject(payload);
var pairs = new Dictionary<string, object>
{
{ "json", newJson }
};
var json = JsonConvert.SerializeObject(pairs);
var content = new StringContent(json, Encoding.UTF8, "application/json");
var response = await client.PostAsync("http://ogre.adc4gis.com/convertJson", content);
if (response.IsSuccessStatusCode)
{
return await response.Content.ReadAsByteArrayAsync();
}
else
{
throw new Exception("Something went wrong");
}
}
すべての呼び出しはエラー400不正な要求を返します。私が試した
{StatusCode: 400, ReasonPhrase: 'Bad Request', Version: 1.1, Content: System.Net.Http.NoWriteNoSeekStreamContent, Headers:
{
Date: Fri, 08 Sep 2017 06:15:01 GMT
ETag: W/"27-Ag3Jnk3T/v6dECAccJTzg4aO/wA"
X-Powered-By: Express
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST
Access-Control-Allow-Headers: X-Requested-With
Access-Control-Expose-Headers: Content-Disposition
Content-Length: 39
Content-Type: application/json; charset=utf-8
}}
もの:
は、オブジェクトにペイロードを変換し、それがあるとしてそれを使用しないでください。
var pairs = new Dictionary<string, string>
{
{ "json", payload }
};
var json = JsonConvert.SerializeObject(pairs);
var content = new StringContent(json, Encoding.UTF8, "application/json");
文字列コンテンツrawを作成します。
payload = "{ \"json\": " + payload + "}";
使用 "アプリケーション/ X-WWW-URL-formencoded" Content-Typeのよう
私はここで全損しています。私は間違って何をしていますか?
EDIT 要求されたとして、ここで成功し郵便配達依頼からのリクエストヘッダです:最後に
POST /convertJson HTTP/1.1
cache-control: no-cache
Postman-Token: 2976abca-6725-43ce-873e-907c12a9fdee
Content-Type: multipart/form-data; boundary=--------------------------829328978588990941765750
User-Agent: PostmanRuntime/6.1.6
Accept: */*
Host: ogre.adc4gis.com
accept-encoding: gzip, deflate
content-length: 629
Connection: keep-alive
郵便配達員からのリクエスト時に送信するヘッダ値は何ですか?上記のJSONをPostman経由でエンドポイントに送信すると、「Bad Request」エラーが発生します。 'var token = await _tokenService.RefreshToken();'とは何ですか?それは必須ですか? 'File(data、" application/octet-stream "、" FeatureClass.Zip ");' –
リクエストヘッダーが更新されました。 tokenServiceは無視してください。最初にJsonを取得するためのauthtokenを生成するためにのみ使用されます。そのため、サンプルのJson文字列を提供しました。 – Marco
telerik fiddlerなどを使用して、電信のメッセージを観察し、郵便配達員とc#outboundを比較します。ヘッダーを特に注意してください。 –