2014-04-14 4 views
0

일반적으로 stackoverflow 및 google 검색을 읽고 다시 읽었으므로 문제가 해결되지 않은 것 같습니다. 나는 그것이 나의 무지라는 것이 긍정적이다.cURL 및 .Net (C#) API 토큰

.Net (C# 구체적으로)에서 cUrl 호출을 재현하려고하는데 시간이 지나가고 왜 작동하지 않는지 알아내는 악마가 있습니다. 이 cUrl 호출은 토큰을 사용하며이를 수행 할 때 사용자 이름은 필요하지 않습니다.

다음 cUrl 호출은 명령 줄에서 호출 할 때 예상대로 작동합니다. 무고한 사람을 보호하기 위해 API 토큰이 변경되었습니다.

  WebRequestHandler webHandler = new WebRequestHandler(); 
     webHandler.Credentials = new System.Net.NetworkCredential("x", "8cb60a319c71be3356da2ea6d7c7650b"); 

     HttpClient client = new HttpClient(webHandler); 

     client.BaseAddress = new Uri("https://deskapi.gotoassist.com/v1/"); 
     client.DefaultRequestHeaders.Accept.Clear(); 
     client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

     HttpResponseMessage response = await client.GetAsync("incidents.json"); 

     if (response.IsSuccessStatusCode) 
     { 
      Console.Write("Success!"); 
     } 

응답은 "잘못된 요청"을 제공합니다

curl -u x:8cb60a319c71be3356da2ea6d7c7650b -H "Content-Type: application/json" https://deskapi.gotoassist.com/v1/incidents.json 

나는 다음과 같은 노력했다. 실제 requestmessage은 다음과 같습니다

그 것이 도움이되는 경우.

다른 유래 사례를 바탕으로 또한 시도 : 또 다른 "잘못된 요청"으로

  HttpClient client = new HttpClient(); 

     client.BaseAddress = new Uri("https://deskapi.gotoassist.com/v1/"); 
     client.DefaultRequestHeaders.Accept.Clear(); 
     client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
     client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("8cb60a319c71be3356da2ea6d7c7650b"); 

     HttpResponseMessage response = await client.GetAsync("incidents.json"); 

     if (response.IsSuccessStatusCode) 
     { 
      Console.Write("Success!"); 
     } 

     Console.Write(response.RequestMessage.ToString()); 

. 이 메시지는 비슷하다

  • response.RequestMessage {방법 : GET, RequestUri 'https://deskapi.gotoassist.com/v1/incidents.json', 버전 : 1.1, 내용 : 헤더 : { 수락 : 응용 프로그램/JSON을 인증을 : 8cb60a319c71be3356da2ea6d7c7650b} } System.Net.Http.HttpRequestMessage

실제 URI가 나에게 올바른 보인다. 콘텐츠 유형이 나에게 맞습니다. 내가 할 수있는 확실한 예를 찾을 수없는 유일한 방법은 "x : 8cb60a319c71be3356da2ea6d7c7650b"다른 방법으로 시도한 것입니다.

의견이 있으십니까? 이런 일을 처음 시도한 것이므로 무언가 무언가를하고 있습니다. 예를 들어 예제를 따르려고했지만 아무 것도 성공하지 못합니다. 도와 주셔서 미리 감사드립니다.

답변

1

cUrl 명령은 몸체를 보낼 때만 사용되는 Content-Type 헤더를 사용합니다. PUT 또는 POST. Accept과 같은 헤더가 아닙니다. Accept은 GET 요청과 함께 보낼 올바른 헤더입니다.

인증 헤더없이 서버를 치려고하면 "알 수없는 OAuth 서명 방법"이라는 메시지가 표시된 400이 표시됩니다. 누락 된 인증에 대한 응답은 실제로 어떤 종류의 구성표를 사용해야하는지 알려주는 401 및 www 인증 헤더 여야합니다.서버가 실제로 OAuth2를 베어러 토큰을 찾고 있다고 가정

, 당신은 시도 할 수도,

client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("bearer","8cb60a319c71be3356da2ea6d7c7650b"); 
+0

당신은 내가 "응용 프로그램/JSON"의 헤더를 전송하는 행을 제거 제안하고 있습니까 그것을 다른 것으로 대체하시오. 내가 그 행을 지우려한다고 가정하고 ... "무기명"을 인증에 추가했습니다. 내가 한 것처럼 "[E901] Unknown OAuth 서명 방법"을 받았습니다. –

+0

@MichaelHenry Accept 헤더가 필요한지 여부는 말할 수 없습니다. 내가 아는 전부는 HTTP가가는 한 GET으로 Content-Type을 보내는 것이 정확하지 않다는 것입니다. 나는 당신이 접근하고있는 서비스가 상관하지 않는다고 생각합니다. 불행히도 서비스 제공 업체로부터 더 많은 문서를 찾아야 할 것입니다. –

+0

@MichaelHenry 서비스에 대한 문서를 보는 것에서 그들은 당신이 그 머리글을 보내는 것을 어리 석고 주장합니다. HttpClient에서 ContentType은 컨텐트를 전송하지 않기 때문에 가지고 있지 않은 HttpContent 헤더에 설정됩니다. request.Headers.AddWithoutValidation을 사용하여 헤더를 수동으로 추가 할 수는 있지만 사용자를 멈추게 할 것입니다. HttpWebRequest를 다시 사용해야 할 수도 있습니다. –

0

디버그 정확히 알 수 Fiddler

피들러를 사용하여 사용하여 코드 무엇 이러한 호출 중에 일어나는 것입니다.

  • CURL 명령 줄에 대해 실행하십시오.
  • 코드와 비교하여 실행하십시오.

기본적으로 아무 것도하지 않고 설치하고 실행하고 인터넷 활동을 수행 할 수 있습니다. 당신은 무엇이 가로 채고 있는지를 볼 것입니다.

문제를 해결하려면 검사기/원시 탭을보고 비교하십시오. 여기

내가 했어 문제의 예 내가 발견 무슨 피들러와 함께 실종됐다 :

Equivalent of "curl -F" parameter for System.Net.Http.MultipartFormDataContent?

+0

피들러에 대한 의견을 보내 주셔서 감사합니다. 나는 바이올린을 설치했지만 커맨드 라인 버전을 포착하지는 않습니다. 그것은 실행했을 때 내 .net 응용 프로그램을 캡처했습니다. 명령 줄 실행을 캡처하기 위해해야 ​​할 일이 있는지 확인해야합니다. –

+1

@MichaelHenry cUrl이 fiddler를 통해 요청을 보내도록 설득 할 수 없다면, www.Runscope.io를 프록시로 사용하여 보내는 요청을 살펴볼 수 있습니다. –

+0

감사합니다. 내가 내일 일하러 돌아올 때 나는 그것을 줄 것이다. –