2017-09-08 8 views
0

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 
+0

郵便配達員からのリクエスト時に送信するヘッダ値は何ですか?上記のJSONをPostman経由でエンドポイントに送信すると、「Bad Request」エラーが発生します。 'var token = await _tokenService.RefreshToken();'とは何ですか?それは必須ですか? 'File(data、" application/octet-stream "、" FeatureClass.Zip ");' –

+0

リクエストヘッダーが更新されました。 tokenServiceは無視してください。最初にJsonを取得するためのauthtokenを生成するためにのみ使用されます。そのため、サンプルのJson文字列を提供しました。 – Marco

+0

telerik fiddlerなどを使用して、電信のメッセージを観察し、郵便配達員とc#outboundを比較します。ヘッダーを特に注意してください。 –

答えて

1

が、私は単純に最初の場所でそれをキャプチャするフィドラーを使用して、ウェブサイト自体からペイロードを再構築それは働いた。

var contentString = "json=" + System.Web.HttpUtility.UrlEncode(JsonConvert.SerializeObject(newJson)); 
var content = new StringContent(contentString, Encoding.UTF8, "application/x-www-form-urlencoded"); 
var response = await client.PostAsync("http://ogre.adc4gis.com/convertJson", content); 
関連する問題