2012-11-07 1 views
1

그래서 콘텐츠 유형으로 application/x-www-form-urlencoded를 사용하여 HTTPWebRequest를 보냈습니다. 이것은 응답이 비슷한 유형으로 반환된다는 것을 의미한다고 가정합니다. (편집 : 지금은이 사실이 아니라고 들었습니다)application/x-www-form-urlencoded를 사용하는 HTTPWebResponse

내 질문은 이것입니다. 응답에서 반환 된 다른 키/값 쌍에 어떻게 액세스합니까? 내 코드는 지금까지 이렇게 보입니다. 당연히 문자열을 읽을 수는 있지만 반드시 문자열을 분리하는 것 이외의 다른 방법으로 데이터에 액세스하는 것이 더 좋습니다.

HttpWebResponse response = SendPOSTRequest("https://site/page?Service=foo", content.ToString(), "", "", true); 

    string responseCode = response.StatusCode.ToString(); 
    string responseStatusDescription = response.StatusDescription; 

    StreamReader sr = new StreamReader(response.GetResponseStream()); 

    string result = sr.ReadToEnd(); 

XML/linq를 사용하여 요소를 XDocument로 읽으려고했지만 물론 XML 형식으로 반환되지 않았습니다.

3 개 또는 4 개의 다른 정보가 있다고 가정하면 어떻게 읽을 수 있습니까?

편집 : 방금 확인한 데이터가 text/plain으로 반환됩니다. 어떻게 이것을 쉽게 처리 할 수 ​​있습니까?

편집 : 회에서는 StreamReader 통해 검색 응답 문자열 :

VPSProtocol=2.23 
Status=OK 
StatusDetail=Server transaction registered successfully. 
VPSTxId={FDC93F3D-FC64-400D-875F-0B7E855AD81F} 
SecurityKey=***** 
NextURL=https://foo.com/PaymentPage.asp?TransactionID={875F-0B7E855AD81F} 

편집 :이 코드 조각이 나에게 부분 방법을 얻을 것으로 보인다. 응답을 목록으로 분리하고 한 줄씩 주소를 지정할 수 있습니다. 그것은 여전히 ​​완벽한 해결책이 아닙니다.

  StreamReader sr = new StreamReader(response.GetResponseStream()); 

      List<string> str = new List<string>; 

      while (sr.Peek() >= 0) 
      { 
       str.Add(sr.ReadLine().ToString()); 
      } 
+1

서버는 요청 내용 유형이 무엇이든 관계없이 모든 것을 반환 할 수 있습니다. – Esailija

+0

응답을 어떻게 보이는지 보여 주겠다. 콘텐츠 유형은 내용 (XML, CSV, JSON 등)을 정확하게 알려주지 않습니다. – tpeczek

+0

OP에서 응답을 보였습니다. 내가 생각하지 않는 원래 응답이 없습니다. 나는 어쨌든 응답 객체에서 그것을 찾지 못했습니다. – CSharpened

답변

1

이것은 조금 빠르고 지저분하지만, 이것을 사전과 같이 구문 분석 할 수 있습니다.

var parsed = result.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.None) 
    .Select(x => 
    { 
     int split = x.IndexOf('='); 
     return new 
     { 
      Key = x.Substring(0, split), 
      Value = x.Substring(split + 1, x.Length - (split + 1)) 
     }; 
    }).ToDictionary(k => k.Key, v => v.Value); 

이것이 얼마나 강력한 지 확실하지 않지만 좋은 시작일 것입니다.

편집 : 값에서 '='문자를 처리하도록 업데이트되었습니다.

+0

크리스. 당신이 말한대로 엄청나게 튼튼하지는 않지만 확실히 텍스트/일반 내용 유형에서 작동해야하는 것처럼 보입니다. 다양한 ContentType 값에 대한 처리 코드를 작성하고 적절하게 처리해야 할 것 같습니다. 내 목록 아이디어는 사전과 비슷한 원리로 작동하지만 변수 이름과 값의 분할을 제공하지 않습니다. – CSharpened

+0

방금 ​​코드를 확인했는데 인덱스 범위를 벗어났습니다. 그냥 머리를 올려. 문제는 URL에있는 쿼리 문자열이므로 문자열 중 하나가 기호 부분을 통과하는 것일 수 있습니다. – CSharpened

+0

ㅎ, 예 - 그게 강력하지 않다고 말하면서 내가 암시하고있는 것입니다. 나는 값을 '='기호로 처리하도록 편집했습니다. 조금 더 성가시다. 그러나 그것은 일을한다. –

0

내 경우는 응답이 INVALID 나 MALFORMED와 같은 특정 단어를 포함하지 않으면 처리해야 할 대상을 항상 알고 있다는 점에서 약간 전문화되었습니다. 나를 텍스트/일반 응답에서 다른 데이터를 얻기 위해 더러운 수정과 같이 이루어졌다 :

string responseCode = response.StatusCode.ToString(); 

string responseStatusDescription = response.StatusDescription; 

StreamReader sr = new StreamReader(response.GetResponseStream()); 

string result = sr.ReadToEnd(); 

string[] parsed = result.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.RemoveEmptyEntries); 

List<string> str = parsed.ToList(); 
Dictionary<string, string> dictionary = new Dictionary<string, string>(); 

foreach (string s in str) 

{ 

string[] ss = s.Split('='); 

    if (ss.Count() == 2) 
    { 
     dictionary.Add(ss[0], ss[1]); 
    } 
    else 
    { 
     string value = ""; 

     for (int i = 0; i < ss.Count(); i++) 
     { 
      switch (i) 
      { 
       case 0: 
       { 
        break; 
       } 
       case 1: 
       { 
        value += ss[i]; 
        break; 
       } 
       default: 
       { 

        value += "=" + ss[i]; 

        break; 
       } 
      } 
     } 

    dictionary.Add(ss[0], value); 
    } 
} 

스위치 문이 있었다의 QueryStrings 일련의 다시 전달 URL을 가지고있는 경우에 때문에 도입 그들을 재구성하는 것이 중요합니다. 위의 코드는 정상적으로 작동합니다.