2016-04-25 7 views
0

アンドロイドアプリでSendUserIdTokenToBackend()メソッドを使用してトークンを投稿しようとしています。投稿でアンドロイドアプリから送信されたパラメータは、Go言語で書かれたバックエンドサーバで常に空です。

private class SendUserIdTokenToBackend extends AsyncTask<String, Void, String> { 

    private Exception exception; 

    @Override 
    protected String doInBackground(String... idToken) { 
     Log.d(TAG, "idToken" + idToken); 
     try { 
      List<Pair> params = new ArrayList<Pair>(); 
      Pair<String, String> pair = Pair.create("idToken", idToken[0]); 
      params.add(pair); 
      String paramString = getQuery(params); 

      URL url = new URL("http://itforhr.com/webservice/android-sign-in"); 
      HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
      conn.setRequestMethod("POST"); 

      conn.setDoOutput(true); 
      OutputStream os = conn.getOutputStream(); 

      BufferedWriter writer = new BufferedWriter(
        new OutputStreamWriter(os, "UTF-8")); 

      writer.write(paramString); 

      writer.flush(); 
      writer.close(); 
      os.close(); 

      Log.d(TAG, "getQuery:" + paramString); 


      conn.connect(); 

      BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); 
      StringBuilder stringBuilder = new StringBuilder(); 

      String line = null; 
      while ((line = reader.readLine()) != null) 
      { 
       stringBuilder.append(line + "\n"); 
      } 

      return stringBuilder.toString(); 


     } catch (Exception e) { 

      return "Error sending ID token to backend. " + e.toString(); 
     } 
    } 

    @Override 
    protected void onPostExecute(String result) { 


     mIdTokenTextView.setText(getString(R.string.id_token_fmt, result)); 
    } 
} 


private String getQuery(List<Pair> params) throws UnsupportedEncodingException 
{ 
    StringBuilder result = new StringBuilder(); 
    boolean first = true; 

    for (Pair pair : params) 
    { 
     if (first) 
      first = false; 
     else 
      result.append("&"); 

     result.append(URLEncoder.encode(pair.first.toString(), "UTF-8")); 
     result.append("="); 
     result.append(URLEncoder.encode(pair.second.toString(), "UTF-8")); 
    } 

    return result.toString(); 
} 

Log.dの結果はOKです。ログにトークンIDが正しく表示されています。

ただし、サーバー側では、私は "マップ[]と" をプリントアウトしidTokenパラメータ

func init() { 
     http.HandleFunc("/webservice/android-sign-in/", androidSignInHandler) 
    } 

    func androidSignInHandler(w http.ResponseWriter, r *http.Request) { 

     log.Println("(-------- Entering androidSignInHandler --------)") 

     ctx := appengine.NewContext(r) 

     idToken := r.FormValue("idToken") 

     client := urlfetch.Client(ctx) 
     _, err := client.Get("https://www.googleapis.com/oauth2/v3/tokeninfo?id_token=" + idToken) 

     if err != nil { 
      http.Error(w, err.Error(), http.StatusInternalServerError) 
      return 
     } else { 

      w.Header().Set("Content-Type", "text/html") 

      fmt.Fprintf(w, "%v and %v", r.PostForm, idToken) 

     } 

     log.Println("(-------- Exiting androidSignInHandler --------)") 

    } 

FMTを得ることができない、idTokenは空です。 idTokenパラメータを取得する前にparseForm()を呼び出そうとしましたが、動作しませんでした。私は2泊のためにここにこだわっています。助けてください。

答えて

1

goのハンドラはうまくいくはずです。また、javaコードが適切な要求を送信する必要があります。通常、このような場合は、部品を別々にテストすると便利です。サーバーをテストするために

一つの方法は、

curl -v --data "idToken=theToken" http://itforhr.com/webservice/android-sign-in 

のように、サーバにリクエストを送信するためにcurlを使用し、それが動作するかどうかをチェックすることです。それがうまくいくなら、問題はクライアント側にあることを知っています。そうでない場合は、おそらくサーバー側にあります。

あなたはさらに、サーバーが実際にそれを解析することなく、身体を読み取ることにより、受信しているかどうか確認することができます:

b, _ := ioutil.ReadAll(r.Body) 
fmt.Print(string(b)) 

や解析後にそれをダンプ:

r.ParseForm() 
fmt.Printf("%#v", r.Form) 

私は、これはあなたがどこ理解するのに役立つはずです願っています問題は。

関連する問題