2017-02-20 86 views
1

我翻译一个JSON API为C#的方法,我遇到了一个问题,即在JSON RPC API(POST)说C#HttpWebRequest的“请求头”,在JSON POST

其他所有方法都需要从认证结果(=的sessionId),或者每pathparameter

;jsessionid=644AFBF2C1B592B68C6B04938BD26965

或每个Cookie(RequestHeader)

JSESSIONID=644AFBF2C1B592B68C6B04938BD26965

我目前的WebRequest方法:

private async static Task<string> SendJsonAndWait(string json, string url, string sessionId) { 
     string result; 

     HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url); 
     httpWebRequest.ContentType = "application/json"; 
     httpWebRequest.Method = "POST"; 

     using(StreamWriter streamWriter = new StreamWriter(await httpWebRequest.GetRequestStreamAsync())) { 
      await streamWriter.WriteAsync(json); 
      streamWriter.Flush(); 
      streamWriter.Close(); 
     } 

     HttpWebResponse httpResponse = (HttpWebResponse)await httpWebRequest.GetResponseAsync(); 
     Stream responseStream = httpResponse.GetResponseStream(); 
     if(responseStream == null) 
      throw new Exception("Response Stream was null!"); 

     using(StreamReader streamReader = new StreamReader(responseStream)) { 
      result = await streamReader.ReadToEndAsync(); 
     } 

     return result; 
    } 

我如何JSESSIONID参数添加到我的WebRequest?我对WebRequests不是很熟悉,请简单解释一下!

谢谢!

+1

您是否尝试直接添加到您的网址? –

+0

正如@RomEh建议的那样,您可以将参数添加到Url中作为查询字符串参数,或者您可以使用键“sessionid”和“json”以及它们的值创建一个字典对象,将其序列化为json字符串,然后将其添加到请求流。 –

回答

1

使用Cookies

你的情况看起来像这样;

private async static Task<string> SendJsonAndWait(string json, string url, string sessionId) { 
    Uri uri = new Uri(url); 
    string result; 

    HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url); 
    httpWebRequest.ContentType = "application/json"; 
    httpWebRequest.Method = "POST"; 

    //Add the JSESSIONID Cookie 
    if(httpWebRequest.CookieContainer == null) 
      httpWebRequest.CookieContainer = new CookieContainer(); 

    if(!string.IsNullOrWhiteSpace(sessionId)) 
      httpWebRequest.CookieContainer.Add(new Cookie("JSESSIONID", sessionId, "/", uri.Host)); 

    using(StreamWriter streamWriter = new StreamWriter(await httpWebRequest.GetRequestStreamAsync())) { 
     await streamWriter.WriteAsync(json); 
     streamWriter.Flush(); 
     streamWriter.Close(); 
    } 

    HttpWebResponse httpResponse = (HttpWebResponse)await httpWebRequest.GetResponseAsync(); 
    Stream responseStream = httpResponse.GetResponseStream(); 
    if(responseStream == null) 
     throw new Exception("Response Stream was null!"); 

    using(StreamReader streamReader = new StreamReader(responseStream)) { 
     result = await streamReader.ReadToEndAsync(); 
    } 

    return result; 
} 
0

您可以直接添加该令牌您的网址:

HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create($"{url}?jsessionid={sessionId}"); 

还是在标题:

HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create({url); 
httpWebRequest.Headers["JSESSIONID"] = sessionId; 
+0

我试过了,我仍然得到服务器的否定响应。我不确定是否有其他问题导致问题,但.. –

+0

如果它有效,您应该尝试{url}?; jsessionid = {sessionId}和{url}; jsessionid = {sessionId}。 –