2017-11-01 8 views
2

Postman에서 호출 할 때 정상적으로 작동하는 GO Lang REST API가 있습니다. 그러나 HttpURLConnection 매개 변수를 사용하여 DELETE 메서드를 호출하려고하면 메서드에 의해 수신되지 않습니다.Java 클라이언트 - Go to HTTP Mux Server - go 메소드에서 매개 변수가 비어 있음

요청 :

_url = new URL(_urlBase+method); 
_http = (HttpURLConnection) _url.openConnection(); 
_http.setRequestMethod(requestType); 
_http.setRequestProperty("Accept", "application/json");  
if ((requestType.toUpperCase().equals("POST")) || (requestType.toUpperCase().equals("DELETE"))) 
{ 
    _http.setRequestProperty("Accept", "application/json"); 

    byte[] postData = params.getBytes(StandardCharsets.UTF_8); 
    int postDataLength = postData.length; 

    _http.setDoOutput(true); 
    _http.setInstanceFollowRedirects(false); 
    _http.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
    _http.setRequestProperty("charset", "utf-8"); 
    _http.setRequestProperty("Content-Length", Integer.toString(postDataLength)); 
    _http.setUseCaches(false); 

    try(DataOutputStream wr = new DataOutputStream(_http.getOutputStream())) { 
     wr.write(postData); 
    } 
} 

if (_http.getResponseCode() != 200) { 
    throw new RuntimeException("Failed : HTTP error code : " + _http.getResponseCode()); 
} 

PS :이 순간에 시험에 세 REST API를 가지고있다. 이 메서드는 GO Lang에 대한 매개 변수를 전달하지 않고 MUX을 사용합니다. 스칼라와 레일즈에서 잘 작동합니다.

추신 : 켜짐 http.Request.FormValue(field)에서 매개 변수가 표시됩니다.

이동 경로 :

r := mux.NewRouter() 
r.HandleFunc("/Rest/get", get).Methods("GET") 
r.HandleFunc("/Rest/putCity/{city}", putCity).Methods("PUT") 
r.HandleFunc("/Rest/updateCity", updateCity).Methods("POST") 
r.HandleFunc("/Rest/deleteCity", deleteCity).Methods("DELETE") 
http.ListenAndServe(":12345", r) 

방법 점점 매개 변수 : 사람을 도우려고에 대한

func deleteCity(w http.ResponseWriter, r *http.Request) { 
    var city string = r.FormValue("city") 
} 

감사합니다! 문안 인사.

답변

1

골란의 http.Request.ParseForm()implementation을 보면 모양 데이터가 DELETE 요청에 대해 구문 분석되지 않은 것으로 보입니다.

나는 도시의 식별자를 사용하는 것이 좋습니다 것

는 URL에 요청 매개 변수로 삭제할 : 당신이 그것에있는 동안

r.HandleFunc("/Rest/deleteCity/{city}", deleteCity).Methods("DELETE") 

, 당신도 할 경로의 전체 정의를 리팩토링 수

r.HandleFunc("/Rest/cities/", getCities).Methods("GET") 
r.HandleFunc("/Rest/cities/{city}", getCity).Methods("GET") 
r.HandleFunc("/Rest/cities/{city}", createCity).Methods("POST") // with body 
r.HandleFunc("/Rest/cities/{city}", updateCity).Methods("PUT") // with body 
r.HandleFunc("/Rest/cities/{city}", deleteCity).Methods("DELETE") 

다음과 같은 스 니펫을 사용하여 요청을 검사 할 수 있습니다. 이 값은 테스트 환경에서만 사용되어야하며 프로덕션 환경이 아닌 테스트 환경에서 사용해야합니다.

func deleteCity(w http.ResponseWriter, r *http.Request) { 
    log.Println("deleteCity handler called") 
    dump, err := httputil.DumpRequest(r, true) 
    if err != nil { 
     http.Error(w, fmt.Sprint(err), http.StatusInternalServerError) 
     return 
    } 
    log.Printf("%q\n", dump) 
    var city string = r.FormValue("city") 
    log.Printf("city: %q\n", city) 
} 
+0

안녕하세요. 먼저 나를 도와 주셔서 감사합니다. 사실,이 게시물을 만들기 전에 이미 제안을 적용하려고했습니다. 그러나, 내가 그것을했을 때, 나는 mux.Vars (httpRequest)에서 params를 얻고 있었고 매개 변수도 얻지 못했습니다. 재미있는 점은 우편 발송자 응용 프로그램에서이 요청을하면 Go 서버가 양방향으로 매개 변수를 가져올 수 있다는 것입니다. 그건 내가 자바 요청 문제를 가지고 있다고 생각하게 만든다. –

+0

Postman과 Java 클라이언트간에 다른 결과를 얻고 싶습니까? 나는 당신의 코드 (우편 배달부와 자바)를 사용하여 이것을 다시 검사했고, DELETE 요청의 경우'FormValue()'에서 리턴 된 양식 값이 없다. 위의 답에 대해 실제 요청과 양식 값을 검사하는 코드 스 니펫을 추가했습니다. – fhe

+0

부수적으로, Java 클라이언트 코드에서'Accept'request 속성을 두 번 설정하고 있습니다 :) – fhe